<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Sanchit Dikshit</title>
    <description>The latest articles on Forem by Sanchit Dikshit (@sanchitkd).</description>
    <link>https://forem.com/sanchitkd</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%2F3318358%2Ffbf859d5-aa72-4ad6-9de4-54367e18d5ac.png</url>
      <title>Forem: Sanchit Dikshit</title>
      <link>https://forem.com/sanchitkd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/sanchitkd"/>
    <language>en</language>
    <item>
      <title>The Two UNDERRATED Files Every Website Needs</title>
      <dc:creator>Sanchit Dikshit</dc:creator>
      <pubDate>Wed, 15 Apr 2026 08:42:17 +0000</pubDate>
      <link>https://forem.com/sanchitkd/the-two-underrated-files-every-website-needs-4251</link>
      <guid>https://forem.com/sanchitkd/the-two-underrated-files-every-website-needs-4251</guid>
      <description>&lt;p&gt;&lt;em&gt;How robots.txt and sitemap.xml quietly control your site's relationship with the internet.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;While going down an SEO rabbit hole one evening, I came across something I had completely overlooked — two small, plain-text files that sit quietly at the root of nearly every website on the internet. Old or new. Big or small. Built on WordPress or hand-written in vanilla HTML.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;robots.txt&lt;/code&gt; and &lt;code&gt;sitemap.xml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The story of these files goes back further than most people realize. In the early days of the web — mid-1990s — search engine bots had no rules. They crawled everything, followed every link, hammered servers, and indexed pages that site owners never intended to be public. It was chaos. So in &lt;strong&gt;1994&lt;/strong&gt;, a developer named Martijn Koster proposed a simple, voluntary agreement: websites would place a plain text file at their root, and crawlers would read it before doing anything. That file was &lt;code&gt;robots.txt&lt;/code&gt; — and it became an informal standard almost overnight.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sitemap.xml&lt;/code&gt; came later, in the early 2000s, when the web exploded in complexity. Crawlers were getting better, but they were still missing deeply nested pages and dynamically generated URLs. Google introduced the sitemap format to let site owners &lt;em&gt;tell&lt;/em&gt; crawlers exactly what existed — rather than waiting for them to discover it.&lt;/p&gt;

&lt;p&gt;Two files. Decades of web history. And we might set them up wrong, or skip them entirely.&lt;/p&gt;

&lt;p&gt;This post is everything I wish I had found in one place.&lt;/p&gt;




&lt;h2&gt;
  
  
  First, a Mental Model
&lt;/h2&gt;

&lt;p&gt;Think of your website as an office building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;robots.txt&lt;/code&gt;&lt;/strong&gt; is the &lt;strong&gt;security guard at the front desk&lt;/strong&gt; — it tells visiting bots (Googlebot, Bingbot, GPTBot, you name it) what they're allowed to access and what's off-limits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;sitemap.xml&lt;/code&gt;&lt;/strong&gt; is the &lt;strong&gt;floor directory on the wall&lt;/strong&gt; — it tells those same bots exactly what rooms (pages) exist, where they are, and how important each one is.&lt;/p&gt;

&lt;p&gt;Neither file is magic. But without them, you're expecting search engines to figure out a maze blindfolded.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;robots.txt&lt;/code&gt; — The Bouncer Your Site Deserves
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What it is
&lt;/h3&gt;

&lt;p&gt;A plain text file that lives at the &lt;strong&gt;root of your domain&lt;/strong&gt;: &lt;code&gt;https://yourdomain.com/robots.txt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It follows a simple format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: *
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /&lt;span class="n"&gt;admin&lt;/span&gt;/
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /&lt;span class="n"&gt;private&lt;/span&gt;/
&lt;span class="n"&gt;Allow&lt;/span&gt;: /

&lt;span class="n"&gt;Sitemap&lt;/span&gt;: &lt;span class="n"&gt;https&lt;/span&gt;://&lt;span class="n"&gt;yourdomain&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;/&lt;span class="n"&gt;sitemap&lt;/span&gt;.&lt;span class="n"&gt;xml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Breaking it down
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Directive&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-agent: *&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Applies the rules to ALL bots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-agent: Googlebot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Applies rules only to Google's crawler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Disallow: /path/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tells bots: stay out of here&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Allow: /path/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Explicitly permits access (useful to override a broader Disallow)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Sitemap:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Points bots directly to your sitemap — gold.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Real-world patterns
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Block everything (staging/dev environments):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: *
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use this on &lt;code&gt;staging.yoursite.com&lt;/code&gt;. You do NOT want Google indexing your half-finished pages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Block AI scrapers specifically:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;GPTBot&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;ClaudeBot&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;CCBot&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yes, AI companies have their own crawlers. Yes, you can block them. Whether you should is your call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protect the back-end, expose the front:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: *
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /&lt;span class="n"&gt;wp&lt;/span&gt;-&lt;span class="n"&gt;admin&lt;/span&gt;/
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /&lt;span class="n"&gt;wp&lt;/span&gt;-&lt;span class="n"&gt;login&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /&lt;span class="n"&gt;cart&lt;/span&gt;/
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /&lt;span class="n"&gt;checkout&lt;/span&gt;/
&lt;span class="n"&gt;Allow&lt;/span&gt;: /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Classic WordPress setup. No reason for Google to index your login page.&lt;/p&gt;

&lt;h3&gt;
  
  
  The golden rule people forget
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;robots.txt is a request, not a lock.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ethical crawlers (Google, Bing, etc.) will respect it. Malicious scrapers won't. If you have genuinely sensitive data, don't rely on robots.txt — use authentication.&lt;/p&gt;

&lt;p&gt;Also: listing a URL in &lt;code&gt;Disallow&lt;/code&gt; does NOT stop Google from &lt;em&gt;knowing&lt;/em&gt; the URL exists if another page links to it. It just stops Googlebot from crawling it. Subtly different.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;sitemap.xml&lt;/code&gt; — Your Site's CV for Search Engines
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What it is
&lt;/h3&gt;

&lt;p&gt;An XML file that lists every page you want indexed, along with optional metadata: when it was last modified, how often it changes, and its priority relative to other pages.&lt;/p&gt;

&lt;p&gt;Bare minimum sitemap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;urlset&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.sitemaps.org/schemas/sitemap/0.9"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://yourdomain.com/&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://yourdomain.com/about/&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://yourdomain.com/blog/my-first-post/&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/urlset&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full-featured entry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://yourdomain.com/blog/robots-and-sitemaps/&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2026-04-15&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;changefreq&amp;gt;&lt;/span&gt;monthly&lt;span class="nt"&gt;&amp;lt;/changefreq&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;priority&amp;gt;&lt;/span&gt;0.8&lt;span class="nt"&gt;&amp;lt;/priority&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The optional fields, honestly rated
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Honest usefulness&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;lastmod&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ Actually useful. Tells Google when you updated content. Use it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;changefreq&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;⚠️ Mostly ignored by Google in practice. Include it anyway for other crawlers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;priority&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;⚠️ Google largely ignores it too. But it's a signal, however faint.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Sitemap index files
&lt;/h3&gt;

&lt;p&gt;Got a large site? You can't cram 50,000 URLs into one file (50,000 is actually the limit per sitemap). Use a &lt;strong&gt;sitemap index&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;sitemapindex&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.sitemaps.org/schemas/sitemap/0.9"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;sitemap&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://yourdomain.com/sitemap-posts.xml&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/sitemap&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;sitemap&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://yourdomain.com/sitemap-pages.xml&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/sitemap&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;sitemap&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://yourdomain.com/sitemap-products.xml&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/sitemap&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/sitemapindex&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Point Google Search Console to the index file — it handles the rest.&lt;/p&gt;

&lt;h3&gt;
  
  
  Specialized sitemaps
&lt;/h3&gt;

&lt;p&gt;Don't sleep on these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image sitemaps&lt;/strong&gt; — Helps Google index your images in search&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video sitemaps&lt;/strong&gt; — Required for rich video results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;News sitemaps&lt;/strong&gt; — For publishers wanting Google News inclusion&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Connection Between the Two
&lt;/h2&gt;

&lt;p&gt;Here's the part most tutorials skip:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your robots.txt should reference your sitemap.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: *
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /&lt;span class="n"&gt;admin&lt;/span&gt;/

&lt;span class="n"&gt;Sitemap&lt;/span&gt;: &lt;span class="n"&gt;https&lt;/span&gt;://&lt;span class="n"&gt;yourdomain&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;/&lt;span class="n"&gt;sitemap&lt;/span&gt;.&lt;span class="n"&gt;xml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last line? It means any crawler that reads your robots.txt — even if they weren't specifically looking for a sitemap — now knows exactly where to find all your content. It's a two-for-one.&lt;/p&gt;

&lt;p&gt;And the inverse: don't list URLs in your sitemap that you've disallowed in robots.txt. You're sending conflicting signals — "here's a page I want indexed" + "don't crawl this page." Google will be confused. Confused Google = bad rankings.&lt;/p&gt;




&lt;h2&gt;
  
  
  Framework Quickstart
&lt;/h2&gt;

&lt;p&gt;Most frameworks handle this with plugins or built-in support:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework / Tool&lt;/th&gt;
&lt;th&gt;Sitemap&lt;/th&gt;
&lt;th&gt;robots.txt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Next.js 13+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;app/sitemap.ts&lt;/code&gt; (built-in)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;app/robots.ts&lt;/code&gt; (built-in)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nuxt 3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@nuxtjs/sitemap&lt;/code&gt; module&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;nuxt-simple-robots&lt;/code&gt; module&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@astrojs/sitemap&lt;/code&gt; integration&lt;/td&gt;
&lt;td&gt;Manual or &lt;code&gt;astro-robots-txt&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WordPress&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yoast SEO / Rank Math&lt;/td&gt;
&lt;td&gt;Yoast SEO / Rank Math&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hugo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;td&gt;Manual in &lt;code&gt;static/robots.txt&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gatsby&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gatsby-plugin-sitemap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gatsby-plugin-robots-txt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you're rolling a custom backend, generate the sitemap dynamically from your database/CMS and serve it at &lt;code&gt;/sitemap.xml&lt;/code&gt;. Most frameworks make this straightforward.&lt;/p&gt;




&lt;h2&gt;
  
  
  Submitting to Search Console (Don't Skip This)
&lt;/h2&gt;

&lt;p&gt;Waiting for Google to find your sitemap organically can take weeks. Do this instead:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://search.google.com/search-console" rel="noopener noreferrer"&gt;Google Search Console&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Select your property&lt;/li&gt;
&lt;li&gt;Left sidebar → &lt;strong&gt;Sitemaps&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;sitemap.xml&lt;/code&gt; → Submit&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You'll see index status, errors, and how many pages Google's actually processed. Check it once a month. Fix errors promptly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes (I've Made Most of These)
&lt;/h2&gt;

&lt;p&gt;🚫 &lt;strong&gt;Blocking CSS/JS files in robots.txt&lt;/strong&gt; — Google needs to render your pages. If you block your stylesheets, Googlebot sees a broken page.&lt;/p&gt;

&lt;p&gt;🚫 &lt;strong&gt;Including noindex pages in your sitemap&lt;/strong&gt; — If a page has &lt;code&gt;&amp;lt;meta name="robots" content="noindex"&amp;gt;&lt;/code&gt;, don't put it in the sitemap. Contradictory signals.&lt;/p&gt;

&lt;p&gt;🚫 &lt;strong&gt;Hardcoding &lt;code&gt;www&lt;/code&gt; vs non-&lt;code&gt;www&lt;/code&gt; inconsistently&lt;/strong&gt; — Your sitemap URLs should match your canonical domain. All &lt;code&gt;https://domain.com&lt;/code&gt; or all &lt;code&gt;https://www.domain.com&lt;/code&gt;. Not a mix.&lt;/p&gt;

&lt;p&gt;🚫 &lt;strong&gt;Forgetting to update the sitemap&lt;/strong&gt; — If you add new pages but never regenerate the sitemap, those pages wait in the dark. Automate this.&lt;/p&gt;

&lt;p&gt;🚫 &lt;strong&gt;Using relative URLs in sitemap&lt;/strong&gt; — Every &lt;code&gt;&amp;lt;loc&amp;gt;&lt;/code&gt; must be an absolute URL with the full scheme: &lt;code&gt;https://yourdomain.com/page/&lt;/code&gt; not &lt;code&gt;/page/&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Things Most People Don't Know (The Interesting Bits)
&lt;/h2&gt;

&lt;p&gt;This is the part I find genuinely fascinating — the stuff that doesn't show up in beginner SEO tutorials.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;robots.txt has its own crawl budget implications.&lt;/strong&gt;&lt;br&gt;
Google has a limited "crawl budget" per site — a rough cap on how many pages it will crawl in a given period. For small sites this rarely matters. For large sites (thousands of pages), a poorly written robots.txt that doesn't block useless URLs (faceted navigation, session IDs, duplicate filtered pages) can eat your crawl budget on junk pages, leaving your important content under-crawled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google publicly logs its robots.txt parsing rules — and they're stricter than the spec.&lt;/strong&gt;&lt;br&gt;
The original robots.txt spec from 1994 is informal and not an official standard. Google published their own &lt;a href="https://developers.google.com/search/docs/crawling-indexing/robots/robots_txt" rel="noopener noreferrer"&gt;formal specification&lt;/a&gt; and even open-sourced their parser. One non-obvious rule: if your robots.txt file returns a &lt;code&gt;5xx&lt;/code&gt; server error, Googlebot treats the &lt;em&gt;entire site&lt;/em&gt; as disallowed and stops crawling until it recovers. A broken server = Google treating your site as fully blocked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;noindex&lt;/code&gt; in HTTP headers works too — no HTML needed.&lt;/strong&gt;&lt;br&gt;
Most people know &lt;code&gt;&amp;lt;meta name="robots" content="noindex"&amp;gt;&lt;/code&gt; in HTML. Fewer know you can send the same instruction as an HTTP response header: &lt;code&gt;X-Robots-Tag: noindex&lt;/code&gt;. This is the &lt;em&gt;only&lt;/em&gt; way to noindex non-HTML files like PDFs, since they have no &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag. Very useful for documentation or internal files served publicly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sitemaps are how Google first learned about many dark web discoveries.&lt;/strong&gt;&lt;br&gt;
This one's more trivia than actionable — but search engines have found accidentally public sitemaps on misconfigured servers that listed URLs the site owner never intended to be public. A sitemap is essentially a complete map of your site handed directly to any crawler that asks. Be intentional about what goes in it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The &lt;code&gt;robots.txt&lt;/code&gt; file is publicly readable by anyone — always.&lt;/strong&gt;&lt;br&gt;
It cannot be password protected (that would defeat its purpose). This means anyone can visit &lt;code&gt;yourdomain.com/robots.txt&lt;/code&gt; and see exactly which paths you're trying to hide. Security researchers and curious people do this routinely. Don't rely on &lt;code&gt;Disallow&lt;/code&gt; to obscure sensitive directory names — it's an announcement, not a curtain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google can index a page it has never crawled&lt;/strong&gt; — if enough other sites link to it.&lt;br&gt;
This means &lt;code&gt;Disallow&lt;/code&gt; in robots.txt doesn't guarantee a page won't appear in search results. It just prevents Googlebot from reading the content. The URL can still show up as a "known but uncrawled" result. To truly remove a page from Google, you need &lt;code&gt;noindex&lt;/code&gt; on the page itself (or use the URL removal tool in Search Console).&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;robots.txt&lt;/code&gt; → tells crawlers what to skip&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sitemap.xml&lt;/code&gt; → tells crawlers what to index&lt;/li&gt;
&lt;li&gt;Always link your sitemap from robots.txt&lt;/li&gt;
&lt;li&gt;Submit to Google Search Console manually — don't wait&lt;/li&gt;
&lt;li&gt;Keep them consistent with each other&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two files. One at the root of your domain. They take 20 minutes to set up properly and can meaningfully change how search engines see your site.&lt;/p&gt;




&lt;h2&gt;
  
  
  Every Website Has One. Go Check.
&lt;/h2&gt;

&lt;p&gt;Here's something I want you to do right now.&lt;/p&gt;

&lt;p&gt;Open a new tab and visit: &lt;strong&gt;&lt;a href="https://www.youtube.com/robots.txt" rel="noopener noreferrer"&gt;youtube.com/robots.txt&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You'll see hundreds of lines — specific bots being blocked, crawl-delay rules, dozens of sitemap references for different content categories. YouTube is one of the most visited sites on the planet, and they have a meticulously maintained robots.txt.&lt;/p&gt;

&lt;p&gt;Now try it on any website you use regularly. Just append &lt;code&gt;/robots.txt&lt;/code&gt; to any domain.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;chatgpt.com/robots.txt&lt;/code&gt;. &lt;code&gt;github.com/robots.txt&lt;/code&gt;. &lt;code&gt;reddit.com/robots.txt&lt;/code&gt;. &lt;code&gt;amazon.com/robots.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Every single one has it. A startup's landing page. A government website. A 1999-era forum that hasn't been updated in a decade. This is what a 30-year-old voluntary internet standard looks like when it works — so universally adopted that it's basically invisible.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;robots.txt&lt;/code&gt; isn't just a config file. It's a piece of living web history.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tried it on a site and found something interesting in their robots.txt? Drop it in the comments.&lt;/em&gt;&lt;/p&gt;




</description>
      <category>seo</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Stuck a ₹10 Sticker on My Wall and Now I Control My Light Like a Wizard</title>
      <dc:creator>Sanchit Dikshit</dc:creator>
      <pubDate>Sat, 28 Mar 2026 09:19:49 +0000</pubDate>
      <link>https://forem.com/sanchitkd/i-stuck-a-10-sticker-on-my-wall-and-now-i-control-my-light-like-a-wizard-2lih</link>
      <guid>https://forem.com/sanchitkd/i-stuck-a-10-sticker-on-my-wall-and-now-i-control-my-light-like-a-wizard-2lih</guid>
      <description>&lt;p&gt;&lt;em&gt;No Alexa. No hub. No voice commands. Just tap and done.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem That Started It All
&lt;/h2&gt;

&lt;p&gt;It's 11:45 PM. I'm in bed, half asleep, and the light is still on.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Get up and hit the physical wall switch (feels like climbing Everest at midnight)&lt;/li&gt;
&lt;li&gt;Unlock my phone, swipe past notifications, find the Wipro app, wait for it to load, tap the bulb tile, confirm the action&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither of these should be this hard in 2026.&lt;/p&gt;

&lt;p&gt;I already had a Wipro Wi-Fi smart bulb installed. Great bulb — RGB, tunable white, music sync, the works. But the app-based control was killing the "smart" experience. And I wasn't going to spend ₹3,000-5,000 on an Amazon Echo or Google Nest just to say "Alexa, lights off" before bed.&lt;/p&gt;

&lt;p&gt;Then I remembered something I'd seen online: &lt;strong&gt;NFC tags&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Small stickers. Programmable. Cost almost nothing. And iPhones can read them without even unlocking.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What if I just... stuck one next to my bed and tapped my phone on it?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Spoiler: It worked. Here's exactly how I built it, what I learned, and how you can replicate it in an afternoon.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Even Is NFC? (Bear With Me, This Is the Fun Part)
&lt;/h2&gt;

&lt;p&gt;Before we get into the setup, let me geek out for a moment — because understanding &lt;em&gt;why&lt;/em&gt; this works makes the whole thing more satisfying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NFC stands for Near Field Communication.&lt;/strong&gt; It's a short-range wireless technology that operates at &lt;strong&gt;13.56 MHz&lt;/strong&gt; and works over a maximum distance of about 4 centimetres. That ridiculously short range is actually a &lt;em&gt;feature&lt;/em&gt; — it means you have to deliberately tap your device to trigger it, so false triggers are essentially impossible.&lt;/p&gt;

&lt;p&gt;NFC is a subset of the broader &lt;strong&gt;RFID (Radio Frequency Identification)&lt;/strong&gt; family of technologies. You've been using RFID/NFC your whole life without knowing it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your credit/debit card for tap-to-pay? NFC.&lt;/li&gt;
&lt;li&gt;Your Mumbai Metro card? RFID.&lt;/li&gt;
&lt;li&gt;That office access card you wave at the door? Also RFID.&lt;/li&gt;
&lt;li&gt;Apple Pay, Google Pay on your phone? NFC.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The difference between passive NFC tags (like the stickers we're using) and your phone is power. Your phone has a battery and an active NFC controller. The tag has neither — it's completely passive. When your phone comes close, it generates a tiny electromagnetic field, which &lt;em&gt;inductively powers the tag&lt;/em&gt; just long enough for it to transmit its stored data back. No battery. No charging. Ever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The tag I used: NTAG213&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the most widely deployed consumer NFC chip in the world. Here's what makes it special:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory:&lt;/strong&gt; 144 bytes of user-accessible storage — enough for a URL, a command, or a short text string&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standard:&lt;/strong&gt; ISO 14443 Type A compliant — meaning it works with virtually every NFC-enabled device&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rewritable:&lt;/strong&gt; You can reprogram it hundreds of times, so if your setup changes, just overwrite the tag&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iPhone compatibility:&lt;/strong&gt; iPhone 7 and above can read NFC tags. iPhone 13 (what I use) supports &lt;strong&gt;background NFC tag reading&lt;/strong&gt; — meaning the screen just needs to be on and unlocked, no app needs to be open&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%2Fgbhoreiwptj7k0xmqgk0.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%2Fgbhoreiwptj7k0xmqgk0.png" alt="NFC Communication Diagram" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One fun fact: the tag has no moving parts, no battery, and theoretically no expiration date. That ₹10 sticker could outlast your phone by a decade.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Shopping List
&lt;/h2&gt;

&lt;p&gt;I only bought two products for this entire project.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Product&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Wipro 12.5W B22D Wi-Fi Smart LED Bulb (16M Colours, Music Sync, Voice Control)&lt;/td&gt;
&lt;td&gt;₹704&lt;/td&gt;
&lt;td&gt;&lt;a href="https://amzn.in/d/0fl89K4c" rel="noopener noreferrer"&gt;Amazon India&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NTAG213 NFC Tag Stickers, Rewritable — Pack of 10&lt;/td&gt;
&lt;td&gt;₹169&lt;/td&gt;
&lt;td&gt;&lt;a href="https://amzn.in/d/0gG2lcYA" rel="noopener noreferrer"&gt;Amazon India&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;₹873&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Everything else I used was free:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wipro Smart Home app&lt;/strong&gt; (iOS/Android — free)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Home app&lt;/strong&gt; (iOS/Android — free)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Assistant app&lt;/strong&gt; (iOS — free)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple Shortcuts&lt;/strong&gt; (built into every iPhone — free)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro tip:&lt;/strong&gt; The pack of 10 tags is the right call even if you only need 3. You'll find uses for the rest faster than you think — business card tag, desk work mode tag, silent mode trigger. More on that at the end.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Architecture — How It All Connects
&lt;/h2&gt;

&lt;p&gt;This is the part most blogs skip, and then readers get lost halfway through setup. Let me show you the full picture first.&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%2F9ywe7oeannekkpjeqqs8.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%2F9ywe7oeannekkpjeqqs8.png" alt="Architecture Diagram" width="800" height="682"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why so many layers?&lt;/strong&gt; Great question. Ideally, the NFC tag would talk directly to the bulb. But Wipro/Tuya doesn't expose native iOS Shortcuts actions, and neither does Google Home. So we build a bridge: iPhone Shortcuts → Google Assistant → Google Home → Bulb. Each layer does one specific job, and together they create a seamless tap-to-control experience.&lt;/p&gt;

&lt;p&gt;The whole chain from tap to bulb response takes about 2-3 seconds. Not instant, but completely hands-free.&lt;/p&gt;




&lt;h2&gt;
  
  
  Physical Setup — Where to Put the Tags
&lt;/h2&gt;

&lt;p&gt;I placed 3 tags in total:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tag 1 — Near the door (ON only)&lt;/strong&gt;&lt;br&gt;
Stuck on the wall right next to the light switch. When I enter the room, I tap this to turn the light on — without touching the physical switch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tag 2 — Bedside (ON)&lt;/strong&gt;&lt;br&gt;
Stuck on the headboard or nearby wall. When I'm in bed and want to turn the light on without getting up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tag 3 — Bedside (OFF)&lt;/strong&gt;&lt;br&gt;
Right next to Tag 2. Tap this to turn off before sleeping.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why two separate tags instead of one toggle?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is important to understand. NFC tags can only store and send a fixed command. They have no way of knowing the current state of your bulb (is it on or off right now?). A single "toggle" tag would be unpredictable — tap once and it turns off, tap again quickly and it turns on again. Two dedicated tags — one for ON, one for OFF — is far more reliable and predictable.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Critical warning:&lt;/strong&gt; The physical wall switch is the Achilles heel of this entire system. If someone flips the physical rocker switch to OFF, the bulb loses mains power completely. No power = no Wi-Fi = no smart control. The NFC system stops working until the physical switch is turned back ON. I recommend putting a small label on the switch that says &lt;em&gt;"Don't switch off — smart bulb"&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;h3&gt;
  
  
  Step 1 — Set Up the Wipro Bulb
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Screw in the Wipro bulb and turn the physical switch ON&lt;/li&gt;
&lt;li&gt;Download the &lt;strong&gt;Wipro Smart Home&lt;/strong&gt; app (iOS / Android)&lt;/li&gt;
&lt;li&gt;Create an account — note your email and password carefully, you'll need them again&lt;/li&gt;
&lt;li&gt;In the app, tap &lt;strong&gt;+&lt;/strong&gt; → &lt;strong&gt;Add Device&lt;/strong&gt; → &lt;strong&gt;Lighting&lt;/strong&gt; → follow the Wi-Fi pairing instructions&lt;/li&gt;
&lt;li&gt;Make sure your phone is on &lt;strong&gt;2.4 GHz Wi-Fi&lt;/strong&gt; during setup (the bulb doesn't support 5 GHz)&lt;/li&gt;
&lt;li&gt;Once paired, test on/off from the app to confirm it's working&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Step 2 — Link Wipro to Google Home
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;strong&gt;Google Home&lt;/strong&gt; app and sign in with your Google account&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;+&lt;/strong&gt; (top right) → &lt;strong&gt;Link app or service&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;Works with Google&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;"Wipro Next Smart Home"&lt;/strong&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%2Fu16cf9ozyy6hv2vgtg84.png" alt="Google Home " width="800" height="1566"&gt;
&lt;/li&gt;
&lt;li&gt;Tap it → tap &lt;strong&gt;Continue&lt;/strong&gt; → tap &lt;strong&gt;Agree and continue&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A Wipro login page opens — &lt;strong&gt;change the country from "United States" to "India"&lt;/strong&gt; first (critical step many miss)
&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%2Ftoklgermf33y1ue3crkw.png" alt="Wipro login page (country = India)" width="800" height="1634"&gt;
&lt;/li&gt;
&lt;li&gt;Enter your Wipro app email and password → tap &lt;strong&gt;Next Step&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Your bulb will appear — tap &lt;strong&gt;Next&lt;/strong&gt; to add it to your home
&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%2Fencnrk2bkuu79j44z2sf.png" alt="Google Home showing bulb added (Smart Bulb 12.5W · On · 100%)" width="800" height="1634"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You should now see your bulb in Google Home, showing its live status.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3 — Create Google Home Routines
&lt;/h3&gt;

&lt;p&gt;This is the engine room. We're creating two voice-triggered routines that Google Home will execute when Google Assistant hears a specific word.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Routine 1 — Lights ON:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Google Home&lt;/strong&gt; → tap &lt;strong&gt;Automations&lt;/strong&gt; (bottom tab)&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;+&lt;/strong&gt; → &lt;strong&gt;New Routine&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Starters&lt;/strong&gt; → &lt;strong&gt;When I say to my Assistant&lt;/strong&gt; → type: &lt;code&gt;Lights&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Actions&lt;/strong&gt; → &lt;strong&gt;Add action&lt;/strong&gt; → &lt;strong&gt;Control home devices&lt;/strong&gt; → select your bulb → &lt;strong&gt;Turn on&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;Save&lt;/strong&gt; — name it "Lights"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Routine 2 — Lights OFF:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Repeat the above process&lt;/li&gt;
&lt;li&gt;Starter phrase: &lt;code&gt;Nights&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Action: Select your bulb → &lt;strong&gt;Turn off&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Save — name it "Nights"&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Why "Lights" and "Nights"?&lt;/strong&gt; These words are phonetically distinct enough that Google Assistant won't confuse them with each other or with random speech. Avoid words like "on" and "off" as standalone triggers — they're too common and might fire accidentally.&lt;/p&gt;
&lt;/blockquote&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%2Fq72l38vc9281wbxvf7rq.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%2Fq72l38vc9281wbxvf7rq.png" alt="Google Home routine detail — " width="800" height="1634"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 4 — Set Up iPhone Shortcuts Automations
&lt;/h3&gt;

&lt;p&gt;This is where NFC comes in. We'll create one automation per tag.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For the Lights ON tag (Door or Bedside):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Shortcuts&lt;/strong&gt; app → tap &lt;strong&gt;Automation&lt;/strong&gt; tab → &lt;strong&gt;+&lt;/strong&gt; → &lt;strong&gt;New Automation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Scroll down → tap &lt;strong&gt;NFC&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;Scan&lt;/strong&gt; → hold your iPhone's &lt;strong&gt;top edge&lt;/strong&gt; close to the NFC tag&lt;/li&gt;
&lt;li&gt;Name the tag &lt;strong&gt;"Lights"&lt;/strong&gt; → tap &lt;strong&gt;OK&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;Add Action&lt;/strong&gt; → search &lt;strong&gt;"Hey Google"&lt;/strong&gt; → select it&lt;/li&gt;
&lt;li&gt;In the Hey Google action, type: &lt;code&gt;Lights&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;+&lt;/strong&gt; below → search &lt;strong&gt;"Wait"&lt;/strong&gt; → set to &lt;strong&gt;3 seconds&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;+&lt;/strong&gt; → search &lt;strong&gt;"Go to Home Screen"&lt;/strong&gt; → add it&lt;/li&gt;
&lt;li&gt;At the top, set &lt;strong&gt;Automation&lt;/strong&gt; to &lt;strong&gt;Run Immediately&lt;/strong&gt; (not "Run After Confirmation")&lt;/li&gt;
&lt;li&gt;Toggle &lt;strong&gt;Notify When Run&lt;/strong&gt; to ON (optional but useful — you get a lock screen confirmation)&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;Done&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;For the Lights OFF tag (Bedside):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Repeat the exact same steps above, but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When you scan the tag, name it &lt;strong&gt;"Nights"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;In the Hey Google action, type: &lt;code&gt;Nights&lt;/code&gt;
&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%2F9686mnjkx45hwwkko1gp.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%2F9686mnjkx45hwwkko1gp.png" alt="Shortcuts automation detail — Hey Google + Wait + Home Screen actions" width="800" height="1614"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 5 — Stick the Tags
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Clean the surface with a dry cloth before sticking&lt;/li&gt;
&lt;li&gt;Press firmly for 5 seconds&lt;/li&gt;
&lt;li&gt;For high-traffic areas, consider an epoxy NFC tag instead of the sticker variant — more durable&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;

&lt;p&gt;Here's what happens now when I want to sleep:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Phone is locked on my nightstand&lt;/li&gt;
&lt;li&gt;I pick it up — screen wakes (Face ID or tap)&lt;/li&gt;
&lt;li&gt;I tap the top edge of my phone to the small sticker on my headboard&lt;/li&gt;
&lt;li&gt;Lock screen shows: &lt;em&gt;"Nights detected — Running your automation"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Google Assistant quietly fires in the background&lt;/li&gt;
&lt;li&gt;Light turns off in ~2-3 seconds&lt;/li&gt;
&lt;li&gt;Phone returns to lock screen&lt;/li&gt;
&lt;/ol&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%2Fpfemji8yt93ycw1j6plk.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%2Fpfemji8yt93ycw1j6plk.png" alt="Lock screen notification " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No app. No voice command. No getting up. Just tap.&lt;/p&gt;

&lt;p&gt;It genuinely feels like a superpower the first time it works.&lt;/p&gt;




&lt;h2&gt;
  
  
  Honest Limitations
&lt;/h2&gt;

&lt;p&gt;I want to be upfront about what this setup &lt;em&gt;doesn't&lt;/em&gt; do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;iPhone must be unlocked&lt;/strong&gt; (screen on) for NFC background reading to work — it doesn't fire from a completely dark, locked screen&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internet required&lt;/strong&gt; — the entire chain goes through cloud services (Wipro → Tuya → Google Home). No internet = no control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~2-3 second delay&lt;/strong&gt; from tap to bulb response — not instant, but acceptable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Physical switch is the weak point&lt;/strong&gt; — if it's off, nothing works&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Assistant app must stay installed&lt;/strong&gt; — if you delete it, the Hey Google Shortcut action breaks&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's Next — Ideas to Extend This
&lt;/h2&gt;

&lt;p&gt;Now that you have 7 leftover NFC tags, here are ideas to use them:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NFC Business Card&lt;/strong&gt; — Program a tag with your website URL. Hand someone a card, they tap their phone, your portfolio opens. Zero app install needed on their end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desk Work Mode Tag&lt;/strong&gt; — Tap when sitting down: bulb switches to cool white 100% brightness automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bedtime Scene Tag&lt;/strong&gt; — Instead of just OFF, trigger a scene: dim to 10% warm white for 10 minutes, then off. Great for winding down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phone Silent Mode&lt;/strong&gt; — NFC tag on your desk at work that triggers a Shortcut to enable Do Not Disturb.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spotify Playlist&lt;/strong&gt; — Tag on your gym bag that opens a specific playlist when tapped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Future upgrade:&lt;/strong&gt; If you ever replace this bulb with a &lt;strong&gt;Matter-compatible smart bulb&lt;/strong&gt;, it will work natively with Apple Home — no Google Assistant bridge needed. The NFC Shortcuts setup remains identical.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Final Tally
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Wipro Smart Bulb&lt;/td&gt;
&lt;td&gt;₹704&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10x NFC Tags&lt;/td&gt;
&lt;td&gt;₹169&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smart speaker&lt;/td&gt;
&lt;td&gt;₹0 (didn't need one)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hub/Bridge&lt;/td&gt;
&lt;td&gt;₹0 (didn't need one)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;₹873&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup time&lt;/td&gt;
&lt;td&gt;~90 minutes (including troubleshooting)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Satisfaction level&lt;/td&gt;
&lt;td&gt;Disproportionately high&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;p&gt;This started as a lazy man's quest to avoid getting out of bed. It became a genuinely fun afternoon of exploring NFC technology, building a multi-layer automation chain, and learning why Wipro uses the Tuya platform under the hood.&lt;/p&gt;

&lt;p&gt;The best part? It cost under ₹1000, uses zero extra hardware, and works every single time.&lt;/p&gt;

&lt;p&gt;If you're on Android, the setup is even simpler — Tasker or the built-in Google routines can trigger directly without the Hey Google workaround.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would you automate with your leftover NFC tags?&lt;/strong&gt; Drop it in the comments — I'm genuinely curious what creative uses people come up with.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Found this useful? Follow me for more experiments where I build things I probably didn't need but definitely enjoyed making.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Products used:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://amzn.in/d/09UMjkPb" rel="noopener noreferrer"&gt;Wipro 12.5W B22D Wi-Fi Smart LED Bulb&lt;/a&gt; — ₹704&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amzn.in/d/01slBpfD" rel="noopener noreferrer"&gt;NTAG213 NFC Tag Stickers Pack of 10&lt;/a&gt; — ₹169&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Apps used (all free):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wipro Smart Home (iOS/Android)&lt;/li&gt;
&lt;li&gt;Google Home (iOS/Android)&lt;/li&gt;
&lt;li&gt;Google Assistant (iOS)&lt;/li&gt;
&lt;li&gt;Apple Shortcuts (built-in on iPhone)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>homeautomation</category>
      <category>ios</category>
      <category>nfc</category>
      <category>iot</category>
    </item>
    <item>
      <title>How I Built a Fully Private Portfolio Using GitHub and Cloudflare — For Free</title>
      <dc:creator>Sanchit Dikshit</dc:creator>
      <pubDate>Thu, 03 Jul 2025 06:02:30 +0000</pubDate>
      <link>https://forem.com/sanchitkd/how-i-built-a-fully-private-portfolio-using-github-and-cloudflare-for-free-3e3b</link>
      <guid>https://forem.com/sanchitkd/how-i-built-a-fully-private-portfolio-using-github-and-cloudflare-for-free-3e3b</guid>
      <description>&lt;p&gt;A complete guide to deploying a portfolio site from a private GitHub repo using Cloudflare Pages, DNS, HTTPS, redirects, and DNSSEC — with zero cost and maximum security.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Why I Built this&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I wanted a clean, secure, and professional online presence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Without exposing my GitHub code&lt;/li&gt;
&lt;li&gt;Without paying for hosting or domain-linked mail servers&lt;/li&gt;
&lt;li&gt;Without sacrificing speed, reliability, or security&lt;/li&gt;
&lt;li&gt;This setup delivers on all of that.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Goals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Deploy from a private GitHub repo&lt;br&gt;
✅ Use a custom domain with full HTTPS&lt;br&gt;
✅ Enforce DNSSEC and redirect rules&lt;br&gt;
✅ Host everything 100% free&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step-by-Step Setup&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create &amp;amp; Push Your Portfolio Repo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Initialize a private GitHub repo named portfolio&lt;/li&gt;
&lt;li&gt;Add your static site files (index.html, images, etc.)&lt;/li&gt;
&lt;li&gt;Add a CNAME file with your custom domain (e.g., &lt;a href="http://www.example.com" rel="noopener noreferrer"&gt;www.example.com&lt;/a&gt;)&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%2Fuargvnre2wamt72dgfjt.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%2Fuargvnre2wamt72dgfjt.png" alt="Image description" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy via Cloudflare Pages
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;code&gt;pages.cloudflare.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click Create Project → Select your private repo&lt;/li&gt;
&lt;li&gt;Choose "None" as the framework, set output directory as .&lt;/li&gt;
&lt;li&gt;Deploy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ You now have a live site at &lt;code&gt;https://your-project.pages.dev&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Transfer DNS to Cloudflare
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Add your domain to Cloudflare&lt;/li&gt;
&lt;li&gt;Let it scan for existing records (optional)&lt;/li&gt;
&lt;li&gt;Update your domain's nameservers in Namecheap to the ones Cloudflare gives you (e.g., &lt;code&gt;dion.ns.cloudflare.com&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Add DNS Records
&lt;/h2&gt;

&lt;p&gt;In Cloudflare DNS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a CNAME:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Name: www
Value: your Pages URL (e.g., `your-project.pages.dev`)
Proxy status: DNS only (important)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add an A record:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Name: @
Value: 192.0.2.1 (dummy IP to enable redirect)
Proxy status: Proxied
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Ffwh4ldd92ungc0kj5rud.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%2Ffwh4ldd92ungc0kj5rud.png" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Add a Custom Domain to Pages
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;In Cloudflare Pages → Your Project → Custom Domains&lt;/li&gt;
&lt;li&gt;Add &lt;a href="http://www.example.com" rel="noopener noreferrer"&gt;www.example.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Choose "My DNS provider"&lt;/li&gt;
&lt;li&gt;Verify CNAME setup&lt;/li&gt;
&lt;li&gt;Enable HTTPS (Cloudflare will issue a free cert)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Redirect example.com to &lt;a href="http://www.example.com" rel="noopener noreferrer"&gt;www.example.com&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Go to Rules → Page Rules&lt;/li&gt;
&lt;li&gt;Add two rules:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://example.com/* → Forward to https://www.example.com/$1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://example.com/* → Forward to https://www.example.com/$1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Enable DNSSEC
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;In Cloudflare → DNS → DNSSEC → Enable&lt;/li&gt;
&lt;li&gt;Copy the DS record Cloudflare gives you&lt;/li&gt;
&lt;li&gt;Go to Namecheap → Domain → Advanced DNS → DNSSEC → Add DS Record&lt;/li&gt;
&lt;li&gt;Paste the values from Cloudflare&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Now your domain is cryptographically signed&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In 2025, you shouldn’t have to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pay for basic static hosting&lt;/li&gt;
&lt;li&gt;Expose your GitHub repo just to host a site&lt;/li&gt;
&lt;li&gt;Settle for a default pages.dev domain&lt;/li&gt;
&lt;li&gt;Compromise on security or speed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This setup checks all the boxes:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Zero cost&lt;br&gt;
✅ Zero code exposure&lt;br&gt;
✅ 100% secure&lt;br&gt;
✅ 100% under your control&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Result&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Accessible at: &lt;code&gt;https://www.example.com&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Private GitHub powered&lt;/li&gt;
&lt;li&gt;HTTPS + DNSSEC secured&lt;/li&gt;
&lt;li&gt;Lightning-fast via Cloudflare&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Want Help Doing the Same?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Drop a comment or connect on &lt;a href="https://x.com/sanchitkd" rel="noopener noreferrer"&gt;X&lt;/a&gt;/&lt;a href="https://www.linkedin.com/in/sanchitkd/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; — happy to help others set this up.&lt;br&gt;
If this guide helped you, please react, save, or share to support more privacy-first builders.&lt;/p&gt;

</description>
      <category>github</category>
      <category>cloudflarechallenge</category>
      <category>webdev</category>
      <category>portfolio</category>
    </item>
  </channel>
</rss>
