<?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: Rafael Cavalcanti da Silva</title>
    <description>The latest articles on DEV Community by Rafael Cavalcanti da Silva (@rafaelroot).</description>
    <link>https://dev.to/rafaelroot</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%2F3815779%2Fd9b9f4d0-828d-4951-abbe-b17d4c0fa666.png</url>
      <title>DEV Community: Rafael Cavalcanti da Silva</title>
      <link>https://dev.to/rafaelroot</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rafaelroot"/>
    <language>en</language>
    <item>
      <title>I Ranked on Google's First Page in 6 Weeks — Here's Every SEO Tactic I Used (Part 2)</title>
      <dc:creator>Rafael Cavalcanti da Silva</dc:creator>
      <pubDate>Thu, 02 Apr 2026 01:24:49 +0000</pubDate>
      <link>https://dev.to/rafaelroot/i-ranked-on-googles-first-page-in-6-weeks-heres-every-seo-tactic-i-used-part-2-f6f</link>
      <guid>https://dev.to/rafaelroot/i-ranked-on-googles-first-page-in-6-weeks-heres-every-seo-tactic-i-used-part-2-f6f</guid>
      <description>&lt;p&gt;&lt;em&gt;This is Part 2 of my SEO case study. &lt;a href="https://dev.to/rafaelroot/seo-case-study-from-zero-to-google-in-12-weeks-part-1"&gt;Part 1 covered the technical foundation&lt;/a&gt;: 9 fixes, PageSpeed 58→87, and the Astro stack setup.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In Part 1, I documented the baseline of &lt;a href="https://rafaelroot.com" rel="noopener noreferrer"&gt;rafaelroot.com&lt;/a&gt;: zero indexation, zero impressions, zero clicks. &lt;strong&gt;Astro SSG&lt;/strong&gt;, strict technical SEO, mobile PageSpeed from 58 to 87.&lt;/p&gt;

&lt;p&gt;Now for the growth phase. This article covers weeks 3 through 6: building authority, deploying to production, and reaching &lt;strong&gt;position 3 on Google's first page&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 TL;DR — Weeks 3 to 6
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Start&lt;/th&gt;
&lt;th&gt;Week 6&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Indexed pages&lt;/td&gt;
&lt;td&gt;0/16&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;16/16&lt;/strong&gt; (100%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primary query position&lt;/td&gt;
&lt;td&gt;100+&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;#3&lt;/strong&gt; (page 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weekly impressions&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;847&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CTR (main query)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12.4%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backlinks&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;7&lt;/strong&gt; high-quality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lighthouse scores&lt;/td&gt;
&lt;td&gt;87/99/99/99&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100/100/100/100&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ⚡ 10-Day Indexation Checkpoint
&lt;/h2&gt;

&lt;p&gt;Ten days after submitting the sitemap, Google indexed all 16 URLs. Complete coverage.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🎯 CHECKPOINT — Week 2 (03/14/2026)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Indexed Pages:&lt;/strong&gt; 16/16&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Impressions:&lt;/strong&gt; 23 | &lt;strong&gt;Clicks:&lt;/strong&gt; 2 | &lt;strong&gt;Position:&lt;/strong&gt; 47.3&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Why so fast?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clean sitemap&lt;/strong&gt; — 16 URLs, zero 404s, no redirect chains&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic HTML&lt;/strong&gt; — Hierarchical headings + valid &lt;code&gt;JSON-LD&lt;/code&gt; schemas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~50ms TTFB&lt;/strong&gt; — Googlebot parses static files instantly&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🏗️ Production Deploy: Nginx Tuned for SEO
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Brotli + Gzip compression
&lt;/h3&gt;

&lt;p&gt;Brotli compresses ~8-9% better than gzip for HTML. Automatic gzip fallback for older clients:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;brotli&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;brotli_comp_level&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;brotli_static&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;brotli_min_length&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;brotli_types&lt;/span&gt; &lt;span class="nc"&gt;text/plain&lt;/span&gt; &lt;span class="nc"&gt;text/css&lt;/span&gt; &lt;span class="nc"&gt;application/json&lt;/span&gt; &lt;span class="nc"&gt;application/javascript&lt;/span&gt;
           &lt;span class="nc"&gt;text/xml&lt;/span&gt; &lt;span class="nc"&gt;application/xml&lt;/span&gt; &lt;span class="nc"&gt;text/javascript&lt;/span&gt; &lt;span class="nc"&gt;image/svg&lt;/span&gt;&lt;span class="s"&gt;+xml&lt;/span&gt; &lt;span class="nc"&gt;font/woff&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;gzip&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;gzip_vary&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;gzip_proxied&lt;/span&gt; &lt;span class="s"&gt;any&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;gzip_comp_level&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Measured results:&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;Encoding&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Reduction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Uncompressed&lt;/td&gt;
&lt;td&gt;18,408 bytes&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gzip&lt;/td&gt;
&lt;td&gt;5,372 bytes&lt;/td&gt;
&lt;td&gt;-70.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Brotli&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4,897 bytes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-73.4%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 475 bytes less than gzip per request. On a 3G connection, that's the difference between passing or failing the LCP Core Web Vital.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  HTTPS + HTTP/2 + Security headers
&lt;/h3&gt;

&lt;p&gt;Full server block with Let's Encrypt SSL, HSTS preload, CSP, and all 6 security headers. Two permanent 301 redirects: HTTP→HTTPS and www→non-www (prevents duplicate content).&lt;/p&gt;

&lt;h3&gt;
  
  
  Layered cache strategy
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Cache&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;CSS, JS, fonts, images&lt;/td&gt;
&lt;td&gt;1 year, &lt;code&gt;immutable&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Hash in filename = never changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML&lt;/td&gt;
&lt;td&gt;1 day, &lt;code&gt;must-revalidate&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Content may update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XML (sitemap)&lt;/td&gt;
&lt;td&gt;1 hour&lt;/td&gt;
&lt;td&gt;Crawlers need fresh data&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Returning visitors download &lt;strong&gt;zero assets&lt;/strong&gt; — only HTML is revalidated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Production TTFB
&lt;/h3&gt;

&lt;p&gt;Homepage: &lt;strong&gt;94ms&lt;/strong&gt; | Blog post: &lt;strong&gt;73ms&lt;/strong&gt; | Protocol: HTTP/2 | Encoding: Brotli&lt;/p&gt;




&lt;h2&gt;
  
  
  📈 GA4 Dashboard for SEO
&lt;/h2&gt;

&lt;p&gt;Rankings mean nothing if users bounce. I configured GA4 with custom events:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Scroll depth tracking — zero dependencies&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isIntersecting&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;gtag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;event&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;scroll_depth&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;section&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;percent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;depth&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;section[data-depth]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The SEO dashboard correlates &lt;strong&gt;Search Console&lt;/strong&gt; (impressions, CTR, position) with &lt;strong&gt;GA4&lt;/strong&gt; (scroll depth, time-on-page, bounce rate).&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Link Building: Authority Footholds
&lt;/h2&gt;

&lt;p&gt;No guest post spam. Instead, I built &lt;strong&gt;contextual presence&lt;/strong&gt; on platforms Google already trusts:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;DA&lt;/th&gt;
&lt;th&gt;Context&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;dev.to&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Original article&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;Full case study with &lt;code&gt;canonical_url&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Profile + README&lt;/td&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;td&gt;Bio + pinned repo with contextual link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Stack Overflow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Profile&lt;/td&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;Website field&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Profile + article&lt;/td&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;td&gt;Featured section + native post&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;npm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Published package&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;Homepage field&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Twitter/X&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Profile + thread&lt;/td&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;td&gt;Bio and tweet with link&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;🔥 &lt;strong&gt;DEV.TO canonical hack:&lt;/strong&gt; Using &lt;code&gt;canonical_url&lt;/code&gt; in dev.to frontmatter transfers DA 61 authority to your blog without triggering duplicate content penalties. This article does exactly that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The key insight: each link has &lt;strong&gt;context&lt;/strong&gt; — it's not a naked URL in an empty bio.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌍 Multilingual Content: The i18n Multiplier
&lt;/h2&gt;

&lt;p&gt;5 languages (pt-BR, pt-PT, en, es, ru) — each article &lt;strong&gt;natively written&lt;/strong&gt;, not machine-translated.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Google detects auto-translated content as low quality&lt;/li&gt;
&lt;li&gt;Each version ranks independently for queries in that language&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hreflang&lt;/code&gt; tags mathematically link all versions
&lt;/li&gt;
&lt;/ol&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;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;
      &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://rafaelroot.com/en/blog/seo-case-study-google-ranking-part-2/"&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;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"es"&lt;/span&gt;
      &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://rafaelroot.com/es/blog/caso-estudio-seo-de-cero-a-google-parte-2/"&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;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"x-default"&lt;/span&gt;
      &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://rafaelroot.com/blog/case-study-seo-do-zero-ao-google-parte-2/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📊 Results: 6 Weeks of Data
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Week&lt;/th&gt;
&lt;th&gt;Impressions&lt;/th&gt;
&lt;th&gt;Clicks&lt;/th&gt;
&lt;th&gt;CTR&lt;/th&gt;
&lt;th&gt;Avg. Position&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8.7%&lt;/td&gt;
&lt;td&gt;47.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;7.9%&lt;/td&gt;
&lt;td&gt;28.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;234&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;9.0%&lt;/td&gt;
&lt;td&gt;14.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;512&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;9.4%&lt;/td&gt;
&lt;td&gt;7.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;847&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;105&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12.4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.8&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Top queries
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Query&lt;/th&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;th&gt;CTR&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;rafael cavalcanti da silva&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;#3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;14.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rafaelroot&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;#1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;28.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rafael cavalcanti developer&lt;/td&gt;
&lt;td&gt;#5&lt;/td&gt;
&lt;td&gt;8.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  SERP comparison — "rafael cavalcanti da silva"
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;th&gt;Baseline&lt;/th&gt;
&lt;th&gt;Week 6&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;jusbrasil.com.br&lt;/td&gt;
&lt;td&gt;jusbrasil.com.br&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;br.linkedin.com&lt;/td&gt;
&lt;td&gt;br.linkedin.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;g1.globo.com&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;rafaelroot.com&lt;/strong&gt; ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Separating technical vs. content impact
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Technical fixes (weeks 1-2):&lt;/strong&gt; complete indexation in 10 days, PageSpeed 87, zero Search Console errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content + authority (weeks 3-6):&lt;/strong&gt; impressions 0→847, ranking 100+→#3, CTR above market average.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The technical foundation let Google index quickly. But it was content and backlinks that moved the ranking.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  💡 Lesson Learned: Don't Shorten Your Brand Name
&lt;/h2&gt;

&lt;p&gt;I tested using the shorter "Rafael Cavalcanti" in titles. The logic: it's a substring, so coverage should be additive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It wasn't.&lt;/strong&gt; Within days, I lost ranking for the full name query. Google re-evaluated the page's primary entity and the diluted signal hurt more than the broader match helped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Reverted all &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;, meta descriptions, &lt;code&gt;og:site_name&lt;/code&gt; back to "Rafael Cavalcanti da Silva". The short form stays only in &lt;code&gt;alternateName&lt;/code&gt; in structured data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; For personal brand SEO, &lt;strong&gt;consistency &amp;gt; coverage&lt;/strong&gt;. If you rank for "firstname lastname suffix," don't dilute it by removing the suffix.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Post-Launch Optimizations (Updates 2-4)
&lt;/h2&gt;

&lt;p&gt;These updates happened after the initial 6-week period and are fully documented in the &lt;a href="https://rafaelroot.com/en/blog/seo-case-study-google-ranking-part-2/" rel="noopener noreferrer"&gt;canonical article&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lighthouse: 100/100/100/100
&lt;/h3&gt;

&lt;p&gt;Three targeted fixes to reach perfect scores:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LCP render delay&lt;/td&gt;
&lt;td&gt;920ms&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Replaced JS font injection with CSS &lt;code&gt;media="print" onload&lt;/code&gt; pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing og:image:alt&lt;/td&gt;
&lt;td&gt;SEO 99&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Added dynamic &lt;code&gt;og:image:alt&lt;/code&gt; + &lt;code&gt;twitter:image:alt&lt;/code&gt; on all pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSS critical chain&lt;/td&gt;
&lt;td&gt;922ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;build.inlineStylesheets: 'always'&lt;/code&gt; — zero external CSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forced reflow&lt;/td&gt;
&lt;td&gt;39ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Batched &lt;code&gt;getBoundingClientRect()&lt;/code&gt; reads before DOM writes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Sitemap: from basic to fully optimized
&lt;/h3&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;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;lastmod&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ All 35 URLs&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;❌&lt;/td&gt;
&lt;td&gt;✅ Per-page-type&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;❌&lt;/td&gt;
&lt;td&gt;✅ Hierarchy (1.0→0.5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blog hreflang&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Cross-language links (5 locales)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redirect URLs&lt;/td&gt;
&lt;td&gt;Leaking ❌&lt;/td&gt;
&lt;td&gt;Filtered ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;image:image&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;15 image entries&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The trickiest part: &lt;code&gt;@astrojs/sitemap&lt;/code&gt; doesn't support blog posts with different slugs per locale. Solution: a &lt;code&gt;blogTranslations&lt;/code&gt; map in &lt;code&gt;serialize()&lt;/code&gt; that links all 5 versions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blogTranslations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;seo-case-study-part-1&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pt-BR&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;/blog/case-study-seo-do-zero-ao-google-parte-1/&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;en&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;/en/blog/seo-case-study-google-ranking-part-1/&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;es&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;/es/blog/caso-estudio-seo-de-cero-a-google-parte-1/&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;h3&gt;
  
  
  Image SEO + sitemap indexing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Renamed &lt;code&gt;image.png&lt;/code&gt; → &lt;code&gt;rafael-cavalcanti-da-silva-fullstack-developer.png&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Created a custom Astro integration (&lt;code&gt;sitemapImageInjector&lt;/code&gt;) that injects &lt;code&gt;&amp;lt;image:image&amp;gt;&lt;/code&gt; tags into sitemap XML post-build&lt;/li&gt;
&lt;li&gt;15 image entries enabling Google Image Search discovery&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Custom 404 page + i18n coverage
&lt;/h3&gt;

&lt;p&gt;Multilingual 404 page with contextual navigation. Added 55+ translation keys and the missing Russian "Trajetória" page.&lt;/p&gt;




&lt;h2&gt;
  
  
  📋 Full Checklist — Weeks 3-6
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ 16/16 URLs indexed (100% coverage)&lt;/li&gt;
&lt;li&gt;✅ GA4 with scroll depth + time-on-page tracking&lt;/li&gt;
&lt;li&gt;✅ 7 high-quality backlinks built&lt;/li&gt;
&lt;li&gt;✅ dev.to article with canonical link&lt;/li&gt;
&lt;li&gt;✅ 5 languages, natively written&lt;/li&gt;
&lt;li&gt;✅ hreflang validated across all versions&lt;/li&gt;
&lt;li&gt;✅ Nginx: Brotli + HTTP/2 + HSTS + 6 security headers&lt;/li&gt;
&lt;li&gt;✅ TTFB: 73-94ms in production&lt;/li&gt;
&lt;li&gt;✅ Lighthouse: &lt;strong&gt;100/100/100/100&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ Sitemap: 35 URLs + priorities + image indexing&lt;/li&gt;
&lt;li&gt;✅ "rafael cavalcanti da silva" → &lt;strong&gt;position 3&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ "rafaelroot" → &lt;strong&gt;position 1&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ CTR 12.4% (above market average)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's Next (Part 3)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A/B titles and meta descriptions for CTR optimization&lt;/li&gt;
&lt;li&gt;Real Core Web Vitals field data (CrUX) vs. lab (Lighthouse)&lt;/li&gt;
&lt;li&gt;Cannibalization analysis across multilingual versions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Final goal: position 1&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Community Feedback
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://dev.to/rafaelroot/seo-case-study-from-zero-to-google-in-12-weeks-part-1"&gt;Part 1 article on dev.to&lt;/a&gt; generated valuable feedback:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/apogeewatcher"&gt;@apogeewatcher&lt;/a&gt;&lt;/strong&gt; suggested separating results into categories (indexation, ranking, CTR, on-page performance) instead of attributing everything to a single change. That suggestion directly influenced the "Separating technical vs. content impact" section above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/apex_stack"&gt;@apex_stack&lt;/a&gt;&lt;/strong&gt; shared experience running a 100k+ page Astro site across 12 languages, validating the &lt;code&gt;translationKey&lt;/code&gt; pattern and warning about crawl budget as a "silent variable."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;@kritika_barod&lt;/strong&gt; confirmed the pattern: Google crawled thousands of pages but didn't index them until authority signals improved.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full technical details with Nginx configs, schema code, and all 4 updates: &lt;a href="https://rafaelroot.com/en/blog/seo-case-study-google-ranking-part-2/" rel="noopener noreferrer"&gt;rafaelroot.com/en/blog/seo-case-study-google-ranking-part-2/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Found this useful? Drop a 🦄 and follow for Part 3 — or check out &lt;a href="https://rafaelroot.com" rel="noopener noreferrer"&gt;rafaelroot.com&lt;/a&gt; to see everything in action.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>performance</category>
      <category>astro</category>
    </item>
    <item>
      <title>SEO Case Study: From zero to Google in 12 weeks — Part 1</title>
      <dc:creator>Rafael Cavalcanti da Silva</dc:creator>
      <pubDate>Tue, 10 Mar 2026 02:47:54 +0000</pubDate>
      <link>https://dev.to/rafaelroot/case-study-seo-do-zero-ao-google-em-12-semanas-parte-1-kn4</link>
      <guid>https://dev.to/rafaelroot/case-study-seo-do-zero-ao-google-em-12-semanas-parte-1-kn4</guid>
      <description>&lt;p&gt;When a recruiter searches your name on Google, what shows up defines the &lt;strong&gt;first impression&lt;/strong&gt;. Controlling that is a technical skill — measurable, reproducible, documentable.&lt;/p&gt;

&lt;p&gt;This is the first article in a 3-part series where I do exactly that &lt;strong&gt;live&lt;/strong&gt;: going from zero indexation to ranking &lt;code&gt;rafael cavalcanti da silva&lt;/code&gt; and &lt;code&gt;rafaelroot&lt;/code&gt; on Google. Real screenshots, real metrics, no theory.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Full original article:&lt;/strong&gt; &lt;a href="https://rafaelroot.com/en/blog/seo-case-study-google-ranking-part-1/" rel="noopener noreferrer"&gt;rafaelroot.com/en/blog/seo-case-study-google-ranking-part-1/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  TL;DR — Week 1 (03/08/2026)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Baseline: &lt;strong&gt;0 results for me&lt;/strong&gt; searching "rafael cavalcanti" or "rafael cavalcanti da silva" in the top 100.&lt;/li&gt;
&lt;li&gt;Stack: Astro 5.17 (SSG) + Nginx with HTTP/2, Brotli, HSTS and security headers.&lt;/li&gt;
&lt;li&gt;Google Search Console configured, sitemap accepted: &lt;strong&gt;16 URLs discovered&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;PageSpeed Mobile: &lt;strong&gt;58 → 87 (+29 points)&lt;/strong&gt; with 9 documented fixes.&lt;/li&gt;
&lt;li&gt;8 fixes applied against Google's official guidelines — no guesswork.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The diagnosis (baseline on 03/08/2026)
&lt;/h2&gt;

&lt;p&gt;Before any optimization, I screenshotted each target SERP. This is the &lt;strong&gt;zero point&lt;/strong&gt; to compare against in the coming months.&lt;/p&gt;

&lt;h3&gt;
  
  
  "rafael cavalcanti"
&lt;/h3&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%2F897q9bu2q6ko2as7dx4h.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%2F897q9bu2q6ko2as7dx4h.png" alt="SERP for "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;Domain&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Rafael Cavalcanti — Bradesco (LinkedIn)&lt;/td&gt;
&lt;td&gt;linkedin.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Rafael Cavalcanti (@rafaelcavalcantig)&lt;/td&gt;
&lt;td&gt;instagram.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Rafael Cavalcanti Garcia de Castro Alves&lt;/td&gt;
&lt;td&gt;escavador.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Rafael Cavalcanti — Lawsuits&lt;/td&gt;
&lt;td&gt;jusbrasil.com.br&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Rafael Cavalcanti de Souza — FAPESP&lt;/td&gt;
&lt;td&gt;bv.fapesp.br&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Diagnosis:&lt;/strong&gt; SERP dominated by namesakes on high-authority platforms. Zero mention of &lt;code&gt;rafaelroot.com&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  "rafael cavalcanti da silva"
&lt;/h3&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%2Fq5ke1zli7p53v6m3whl6.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%2Fq5ke1zli7p53v6m3whl6.png" alt="SERP for "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;Domain&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Rafael Cavalcanti da Silva — Lawsuits&lt;/td&gt;
&lt;td&gt;jusbrasil.com.br&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;7 profiles with the name&lt;/td&gt;
&lt;td&gt;br.linkedin.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Who is Rafael Chocolate...&lt;/td&gt;
&lt;td&gt;g1.globo.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4–6&lt;/td&gt;
&lt;td&gt;Business registrations and influencer&lt;/td&gt;
&lt;td&gt;serasa, instagram, istoedinheiro&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Diagnosis:&lt;/strong&gt; Moderate competition, but dominated by negative content (lawsuits, convictions) — which opens a real opportunity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Formal baseline
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;╔══════════════════════════════════════════════════════════════╗
║                    BASELINE — 03/08/2026                     ║
╠══════════════════════════════════════════════════════════════╣
║  "rafael cavalcanti da silva" → outside top 100              ║
║  "rafael cavalcanti"          → outside top 100              ║
║  "rafaelroot"                 → nonexistent word (vol. 0)    ║
║                                                              ║
║  Indexed pages: 0                                            ║
║  Search Console impressions: 0                               ║
║  Organic clicks: 0                                           ║
║  Known backlinks: 0                                          ║
╚══════════════════════════════════════════════════════════════╝
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The plan: 3 phases, 12 weeks
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Period&lt;/th&gt;
&lt;th&gt;Focus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1 — Foundations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Weeks 1-2&lt;/td&gt;
&lt;td&gt;Baseline, stack, Search Console, GA4, technical fixes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2 — Content &amp;amp; Authority&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Weeks 3-6&lt;/td&gt;
&lt;td&gt;Optimized articles, profiles, link building, cross-links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3 — Measurement &amp;amp; Tuning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Weeks 7-12&lt;/td&gt;
&lt;td&gt;A/B title tests, real CWV, Part 3 with results&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why Astro?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Astro SSG → Static HTML → 0kb JS by default
├── LCP: &amp;lt; 1.0s
├── FID: 0ms (no JS = no blocking)
├── CLS: 0 (no reflow)
└── TTFB: ~50ms (static file via Nginx)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;JS Bundle&lt;/th&gt;
&lt;th&gt;Typical LCP&lt;/th&gt;
&lt;th&gt;SEO Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Astro (SSG)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0 KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&amp;lt; 1s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next.js (SSR)&lt;/td&gt;
&lt;td&gt;~80 KB&lt;/td&gt;
&lt;td&gt;1.5-2.5s&lt;/td&gt;
&lt;td&gt;90-95&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create React App&lt;/td&gt;
&lt;td&gt;~200 KB&lt;/td&gt;
&lt;td&gt;3-5s&lt;/td&gt;
&lt;td&gt;50-70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WordPress&lt;/td&gt;
&lt;td&gt;~150 KB&lt;/td&gt;
&lt;td&gt;2-4s&lt;/td&gt;
&lt;td&gt;60-80&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Sitemap with priorities and i18n (Astro)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// astro.config.mjs&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;defineConfig&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;astro/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;sitemap&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;@astrojs/sitemap&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;site&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://rafaelroot.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;integrations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nf"&gt;sitemap&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;i18n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;defaultLocale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pt-br&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;locales&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;pt-br&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;pt-BR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;pt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pt-PT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;es&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;es&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;en&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ru&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ru&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="nf"&gt;serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;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://rafaelroot.com/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="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="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;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;blog&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;.+&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&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;item&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;0.9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="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;monthly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Nginx: SEO-focused configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;rafaelroot.com&lt;/span&gt; &lt;span class="s"&gt;www.rafaelroot.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# HSTS — 1 year with preload&lt;/span&gt;
    &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Strict-Transport-Security&lt;/span&gt; &lt;span class="s"&gt;"max-age=31536000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;includeSubDomains&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;preload"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# Security headers&lt;/span&gt;
    &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Content-Type-Options&lt;/span&gt; &lt;span class="s"&gt;"nosniff"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Frame-Options&lt;/span&gt; &lt;span class="s"&gt;"SAMEORIGIN"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Referrer-Policy&lt;/span&gt; &lt;span class="s"&gt;"strict-origin-when-cross-origin"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# Brotli + Gzip&lt;/span&gt;
    &lt;span class="kn"&gt;brotli&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;brotli_comp_level&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;gzip&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# Aggressive cache for immutable assets&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;.(css|js|woff2|png|webp|avif|svg|ico)&lt;/span&gt;$ &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;expires&lt;/span&gt; &lt;span class="s"&gt;1y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Cache-Control&lt;/span&gt; &lt;span class="s"&gt;"public,&lt;/span&gt; &lt;span class="s"&gt;immutable"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Always fresh HTML&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;.html&lt;/span&gt;$ &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;expires&lt;/span&gt; &lt;span class="s"&gt;1h&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Cache-Control&lt;/span&gt; &lt;span class="s"&gt;"public,&lt;/span&gt; &lt;span class="s"&gt;must-revalidate"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why each directive matters for SEO:&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;Directive&lt;/th&gt;
&lt;th&gt;SEO Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;http2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Multiplexing → lower TTFB → better LCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;brotli&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~20% smaller than gzip → reduced transfer size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;expires 1y + immutable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Eliminates re-downloads → better FCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HSTS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Google favors HTTPS → ranking signal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Google Search Console ✅
&lt;/h2&gt;

&lt;p&gt;Sitemap accepted on 03/08/2026:&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%2Fwekhkp3crjo2dgceyosy.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%2Fwekhkp3crjo2dgceyosy.png" alt="Sitemap indexed with 16 discovered URLs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sitemap&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sitemap-index.xml&lt;/code&gt; → &lt;code&gt;sitemap-0.xml&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discovered URLs&lt;/td&gt;
&lt;td&gt;16 (5 homepages + 5 blog indexes + 6 articles)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  9 documented technical fixes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🚨 Fix 1 — robots.txt was blocking Googlebot's CSS ✅
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; &lt;code&gt;Disallow: /_astro/&lt;/code&gt; prevented Googlebot from accessing Astro's bundled CSS. Google was seeing raw HTML without styles — this can silently hurt your ranking.&lt;/p&gt;

&lt;p&gt;Google's own documentation states:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"For this, Google needs to be able to access the same resources as the user's browser. If your site is hiding important components that make up your website (like CSS and JavaScript), Google might not be able to understand your pages."&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;# robots.txt — BEFORE (blocking CSS)&lt;/span&gt;
&lt;span class="k"&gt;User-agent:&lt;/span&gt; &lt;span class="s"&gt;*&lt;/span&gt;
&lt;span class="s"&gt;Disallow:&lt;/span&gt; &lt;span class="n"&gt;/_astro/&lt;/span&gt;   &lt;span class="s"&gt;←&lt;/span&gt; &lt;span class="s"&gt;BLOCKED&lt;/span&gt; &lt;span class="s"&gt;BUNDLED&lt;/span&gt; &lt;span class="s"&gt;CSS!&lt;/span&gt;

&lt;span class="c1"&gt;# robots.txt — AFTER (correct)&lt;/span&gt;
&lt;span class="s"&gt;User-agent:&lt;/span&gt; &lt;span class="s"&gt;*&lt;/span&gt;
&lt;span class="s"&gt;Allow:&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt;
&lt;span class="c1"&gt;# /_astro/ removed — Googlebot needs the CSS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How to verify:&lt;/strong&gt; Search Console → URL Inspection → "Test Live URL" → Screenshot. If CSS doesn't load, you'll see unstyled HTML.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 Fix 2 — Removed &lt;code&gt;&amp;lt;meta name="keywords"&amp;gt;&lt;/code&gt; ✅
&lt;/h3&gt;

&lt;p&gt;Google explicitly states:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Google Search doesn't use the keywords meta tag."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Besides being useless, it exposes your keyword strategy to competitors. Removed from both layouts.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌐 Fix 3 — hreflang on blog articles ✅
&lt;/h3&gt;

&lt;p&gt;The homepage had correct hreflang for 5 languages. Blog articles had none. I implemented a &lt;code&gt;translationKey&lt;/code&gt; system in the frontmatter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# article frontmatter&lt;/span&gt;
&lt;span class="na"&gt;translationKey&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reverse-engineering-android-frida"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Articles sharing the same &lt;code&gt;translationKey&lt;/code&gt; are automatically cross-linked at build time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Generated output for the PT-BR article --&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;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"pt-BR"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://rafaelroot.com/blog/engenharia-reversa-android-frida/"&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;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://rafaelroot.com/en/blog/reverse-engineering-android-frida/"&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;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"x-default"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://rafaelroot.com/blog/engenharia-reversa-android-frida/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without this, Google may index only one version and treat the other as duplicate content.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚡ Fix 4 — CSS/Fonts no longer block rendering ✅
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; Google Fonts and devicon.min.css loaded synchronously in &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; were blocking First Contentful Paint. On slow mobile, this cost up to &lt;strong&gt;4,570ms&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- BEFORE (render-blocking) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://fonts.googleapis.com/..."&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- AFTER (non-blocking) --&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;"preload"&lt;/span&gt; &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"style"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://fonts.googleapis.com/..."&lt;/span&gt;
      &lt;span class="na"&gt;onload=&lt;/span&gt;&lt;span class="s"&gt;"this.onload=null;this.rel='stylesheet'"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;noscript&amp;gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://fonts.googleapis.com/..."&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&amp;lt;/noscript&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser paints immediately with system fonts and swaps when custom fonts load — without blocking FCP.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎨 Fix 5 — AA contrast fixed ✅
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;--muted&lt;/code&gt; color (&lt;code&gt;#5a7a9a&lt;/code&gt;) against background &lt;code&gt;#040a12&lt;/code&gt; had a ratio of 4.45:1 — below the WCAG AA minimum of 4.5:1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* BEFORE */&lt;/span&gt;
&lt;span class="nt"&gt;--muted&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;#5&lt;/span&gt;&lt;span class="nt"&gt;a7a9a&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;/* 4.45:1 — FAILS AA */&lt;/span&gt;

&lt;span class="c"&gt;/* AFTER */&lt;/span&gt;
&lt;span class="nt"&gt;--muted&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;#7090&lt;/span&gt;&lt;span class="nt"&gt;b0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;/* 5.96:1 — PASSES both: bg and glass nav */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📱 Fix 6 — Mobile performance: content-visibility ✅
&lt;/h3&gt;

&lt;p&gt;Google uses &lt;strong&gt;Mobile-First Indexing&lt;/strong&gt; — the mobile score is what affects your ranking. Our page has 9 sections but the browser was rendering all of them at once.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Skip rendering for off-screen sections */&lt;/span&gt;
&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;content-visibility&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;contain-intrinsic-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt; &lt;span class="m"&gt;600px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Disable expensive GPU effects on mobile */&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;768px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.nav-outer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;backdrop-filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;blur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;/* was 16px */&lt;/span&gt;
  &lt;span class="nc"&gt;.btn&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.hero-badge&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.bio-grid&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;backdrop-filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.hero-badge&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&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;
  
  
  🔤 Fix 7 — CLS: font fallbacks with size-adjust ✅
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;font-display: swap&lt;/code&gt; caused layout shift when Inter and JetBrains Mono replaced system fonts. Fix: declare &lt;code&gt;@font-face&lt;/code&gt; fallbacks with matching metrics.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@font-face&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'JetBrains Mono Fallback'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;'Courier New'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;size-adjust&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;108%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;/* calibrated metrics for zero reflow */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;@font-face&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Inter Fallback'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;'Arial'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;size-adjust&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Updated stacks */&lt;/span&gt;
&lt;span class="nt"&gt;--mono&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'JetBrains Mono'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'JetBrains Mono Fallback'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;monospace&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--sans&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Inter'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'Inter Fallback'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;system-ui&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;sans-serif&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🏷️ Fix 8 — Optimized titles ✅
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem 1 — Truncation:&lt;/strong&gt; Titles at ~87 chars. Google truncates at ~55-60 chars.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 2 — Redundant site name:&lt;/strong&gt; Since we have &lt;code&gt;WebSite&lt;/code&gt; schema with &lt;code&gt;name: 'rafaelroot.com'&lt;/code&gt;, Google already shows the site name separately in SERPs. Including it in &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; wasted 18 chars.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 3 — Mixed delimiters:&lt;/strong&gt; &lt;code&gt;|&lt;/code&gt; and &lt;code&gt;—&lt;/code&gt; in the same title.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# BEFORE (87 chars, truncated)&lt;/span&gt;
Rafael Cavalcanti da Silva | Fullstack Developer &amp;amp; Security Specialist — rafaelroot.com

&lt;span class="gh"&gt;# AFTER (57 chars, fully visible)&lt;/span&gt;
Rafael Cavalcanti da Silva — Fullstack Developer &amp;amp; Security
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📄 Fix 9 — Structured data: ProfilePage + WebSite ✅
&lt;/h3&gt;

&lt;p&gt;Homepage upgraded from &lt;code&gt;WebPage&lt;/code&gt; to &lt;code&gt;ProfilePage&lt;/code&gt; (a subtype of WebPage). The &lt;code&gt;WebSite&lt;/code&gt; schema gained &lt;code&gt;alternateName&lt;/code&gt; and a trailing slash on &lt;code&gt;url&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;WebSite&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;—&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;AFTER&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WebSite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rafaelroot.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"alternateName"&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="s2"&gt;"Rafael Cavalcanti"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rafael Cavalcanti da Silva"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rafaelroot"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://rafaelroot.com/"&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Homepage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;—&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;AFTER&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ProfilePage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mainEntity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"@id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://rafaelroot.com/#person"&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;"dateCreated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-02-01T00:00:00-03:00"&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;
  
  
  PageSpeed: before vs. after
&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%2Fm9tkt5o4ll3tjnd13h2n.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%2Fm9tkt5o4ll3tjnd13h2n.png" alt="Desktop and Mobile scores after optimizations"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric (Mobile)&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;Delta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;87&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;+29&lt;/strong&gt; 🚀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Accessibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;+4&lt;/strong&gt; ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best Practices&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEO&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FCP&lt;/td&gt;
&lt;td&gt;6.7s&lt;/td&gt;
&lt;td&gt;2.8s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-58%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LCP&lt;/td&gt;
&lt;td&gt;6.7s&lt;/td&gt;
&lt;td&gt;2.8s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-58%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speed Index&lt;/td&gt;
&lt;td&gt;9.4s&lt;/td&gt;
&lt;td&gt;2.9s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-69%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TBT&lt;/td&gt;
&lt;td&gt;0ms&lt;/td&gt;
&lt;td&gt;0ms&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLS&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0.113*&lt;/td&gt;
&lt;td&gt;*fixing with size-adjust&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Desktop stays at &lt;strong&gt;90 / 96 / 100 / 100&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Going from &lt;strong&gt;58 → 87 on mobile&lt;/strong&gt; is the highest-impact SEO improvement possible: Google uses Mobile-First Indexing to determine ranking. Mobile performance = ranking.&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%2Fz06iwmx3ws53zg1kw818.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%2Fz06iwmx3ws53zg1kw818.png" alt="Render-blocking and cache diagnostics"&gt;&lt;/a&gt;&lt;br&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%2Fw5dmdrldq9kxf67htafw.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%2Fw5dmdrldq9kxf67htafw.png" alt="Passing audits and best practices"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Google says NOT to worry about
&lt;/h2&gt;

&lt;p&gt;Common myths debunked by Google's own guidelines:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Myth&lt;/th&gt;
&lt;th&gt;What Google says&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Meta keywords&lt;/td&gt;
&lt;td&gt;&lt;em&gt;"Google Search doesn't use the keywords meta tag."&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keyword stuffing&lt;/td&gt;
&lt;td&gt;Against spam policies. Write naturally.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keywords in domain&lt;/td&gt;
&lt;td&gt;&lt;em&gt;"...have hardly any effect beyond appearing in breadcrumbs."&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Word count&lt;/td&gt;
&lt;td&gt;&lt;em&gt;"The length of the content alone doesn't matter for ranking."&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E-E-A-T as ranking factor&lt;/td&gt;
&lt;td&gt;It's not. It's a quality evaluation framework.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duplicate content penalty&lt;/td&gt;
&lt;td&gt;&lt;em&gt;"It's inefficient, but it's not something that will cause a manual action."&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Week 1 checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[x] SERP baseline with screenshots and tables (03/08/2026)&lt;/li&gt;
&lt;li&gt;[x] Search Console configured + sitemap accepted (16 URLs)&lt;/li&gt;
&lt;li&gt;[x] robots.txt fixed (no longer blocks &lt;code&gt;/_astro/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;[x] &lt;code&gt;&amp;lt;meta name="keywords"&amp;gt;&lt;/code&gt; removed from both layouts&lt;/li&gt;
&lt;li&gt;[x] hreflang on articles via &lt;code&gt;translationKey&lt;/code&gt; system&lt;/li&gt;
&lt;li&gt;[x] CSS/Fonts non-blocking (async preload + noscript fallback)&lt;/li&gt;
&lt;li&gt;[x] AA contrast: &lt;code&gt;--muted&lt;/code&gt; → &lt;code&gt;#7090b0&lt;/code&gt; (5.96:1)&lt;/li&gt;
&lt;li&gt;[x] Mobile: &lt;code&gt;content-visibility: auto&lt;/code&gt; + reduced &lt;code&gt;backdrop-filter&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[x] CLS: &lt;code&gt;@font-face&lt;/code&gt; fallbacks with calibrated &lt;code&gt;size-adjust&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[x] Titles shortened (&amp;lt;60 chars) + single &lt;code&gt;—&lt;/code&gt; delimiter&lt;/li&gt;
&lt;li&gt;[x] ProfilePage schema on homepage + WebSite schema fixed&lt;/li&gt;
&lt;li&gt;[x] Real link to &lt;code&gt;/blog&lt;/code&gt; in footer (sitelink-friendly)&lt;/li&gt;
&lt;li&gt;[x] PageSpeed Mobile: &lt;strong&gt;58 → 87&lt;/strong&gt; | Desktop: 90/96/100/100&lt;/li&gt;
&lt;li&gt;[ ] Create GA4 property + set &lt;code&gt;PUBLIC_GA_ID&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Deploy Nginx with optimized cache headers&lt;/li&gt;
&lt;li&gt;[ ] Re-run PageSpeed after deploy (confirm CLS &amp;lt; 0.1)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Next steps (Part 2)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Measure real indexation: checkpoint 03/14&lt;/li&gt;
&lt;li&gt;GA4 with real ID + SEO dashboard (CTR, scroll depth, time on page)&lt;/li&gt;
&lt;li&gt;Link building: GitHub, Stack Overflow, dev.to&lt;/li&gt;
&lt;li&gt;First article targeting "rafael cavalcanti developer" with internal cross-links&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I'm documenting everything in real time. Follow the series and let me know in the comments: &lt;strong&gt;which metric do you want to track in Part 2?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Last updated: March 8, 2026 | &lt;a href="https://rafaelroot.com/en/blog/seo-case-study-google-ranking-part-1/" rel="noopener noreferrer"&gt;Full article with more technical details&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>astro</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
