<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Figueirego Blog – SEO</title><link>https://figueirego.com/blog/tags/seo/</link><description>Recent posts in SEO on Figueirego Blog.</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Mon, 19 Oct 2026 04:33:15 -0300</lastBuildDate><atom:link href="https://figueirego.com/blog/tags/seo/index.xml" rel="self" type="application/rss+xml"/><item><title>Building my blog, part 5: SEO, languages, and RSS</title><link>https://figueirego.com/blog/posts/building-the-blog-05-seo-rss/</link><pubDate>Mon, 19 Oct 2026 04:15:50 -0300</pubDate><guid>https://figueirego.com/blog/posts/building-the-blog-05-seo-rss/</guid><description>&lt;p&gt;&lt;img src="https://figueirego-blog-images.s3.us-east-1.amazonaws.com/images/2026/10/building-blog-seo-rss/seo-rss.webp" alt="Library with a card catalog, an open book and a window overlooking illuminated homes at night."&gt;&lt;/p&gt;&lt;p&gt;An article can open normally in the browser and still present itself incorrectly elsewhere. Its search title may be generic, a Portuguese page may advertise the English feed, or a topic feed may contain every article on the blog.&lt;/p&gt;
&lt;p&gt;While reviewing the website, I began looking at these outputs too. Published content needs to remain identifiable outside the layout I designed for it.&lt;/p&gt;
&lt;h2 data-hextra-search-id="visible-identity-and-metadata-have-their-own-roles"&gt;Visible identity and metadata have their own roles&lt;span class="hx:absolute hx:-mt-20" id="visible-identity-and-metadata-have-their-own-roles"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;On the page, a title and description help people understand where they are. Metadata provides the title, description, URL, and other information used by external services. These fields should agree about the content without repeating the brand in every visible sentence.&lt;/p&gt;
&lt;p&gt;Articles in this project use editorial data to generate social metadata and structured information. Review starts with the writing: a specific title, a description explaining the subject, and sections that deliver what was promised. Adding search terms that the article never explains would not help.&lt;/p&gt;
&lt;p&gt;Each part of this series has a focus: architecture, reading, publishing, images, or discovery. Links between them help readers follow the story without turning five articles into variations of the same introduction.&lt;/p&gt;
&lt;h2 data-hextra-search-id="two-languages-need-clear-addresses"&gt;Two languages need clear addresses&lt;span class="hx:absolute hx:-mt-20" id="two-languages-need-clear-addresses"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;English articles live under &lt;code&gt;/blog/&lt;/code&gt;; Portuguese articles under &lt;code&gt;/pt/blog/&lt;/code&gt;. A &lt;code&gt;translationKey&lt;/code&gt; relates the files, while language metadata points to the equivalent pages.&lt;/p&gt;
&lt;p&gt;A canonical URL identifies the preferred address for that page. &lt;code&gt;hreflang&lt;/code&gt; identifies language alternatives. The Portuguese version should not treat English as the only primary page and lose its own identity. Both versions need consistent, corresponding links.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://developers.google.com/search/docs/specialty/international/localized-versions" target="_blank" rel="noopener"&gt;Google&amp;rsquo;s localized-version documentation&lt;/a&gt; explains the relationship between these alternatives. In my workflow, validation of generated files helps identify incorrect translation links before publication.&lt;/p&gt;
&lt;p&gt;The sitemap should also reflect what is publicly available. Drafts stay out of normal publication, and a preview should not be treated as the final address.&lt;/p&gt;
&lt;h2 data-hextra-search-id="requesting-indexing-does-not-prove-the-outcome"&gt;Requesting indexing does not prove the outcome&lt;span class="hx:absolute hx:-mt-20" id="requesting-indexing-does-not-prove-the-outcome"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Search Console has different stages that can look like one when you focus only on a success message:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;th&gt;What it establishes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Accepted request&lt;/td&gt;
&lt;td&gt;The request was received.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page already indexed&lt;/td&gt;
&lt;td&gt;A version of the page exists in the index.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New crawl&lt;/td&gt;
&lt;td&gt;Google fetched the page again.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Displayed search result&lt;/td&gt;
&lt;td&gt;You can observe how it appeared for that query.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A crawl after an edit does not, by itself, demonstrate that the new description was adopted in the result. It does not guarantee a position for a keyword either. Google explicitly notes that &lt;a href="https://developers.google.com/search/docs/crawling-indexing/ask-google-to-recrawl" target="_blank" rel="noopener"&gt;requesting another crawl does not guarantee immediate inclusion or inclusion in the index&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The project includes a routine that reads indexing status for the main pages. It tracks changes and failures; it does not submit a new request or automatically track every future article. The monitored set needs review as the website grows.&lt;/p&gt;
&lt;h2 data-hextra-search-id="rss-is-another-presentation-of-the-same-content"&gt;RSS is another presentation of the same content&lt;span class="hx:absolute hx:-mt-20" id="rss-is-another-presentation-of-the-same-content"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;RSS lets people follow publications through a feed reader. They subscribe to an address and receive items without visiting the home page to check for something new.&lt;/p&gt;
&lt;p&gt;The general Portuguese feed is at &lt;code&gt;/pt/blog/index.xml&lt;/code&gt;; English is at &lt;code&gt;/blog/index.xml&lt;/code&gt;. Topic and section pages can also have their own feeds. The scope needs to match the page: someone subscribing to a topic expects articles about that topic.&lt;/p&gt;
&lt;p&gt;Identification happens in two layers. HTML advertises the feed through a discovery link, and the XML itself identifies its title, language, link, and &lt;code&gt;self&lt;/code&gt; URL. A Portuguese page advertising the English feed would be wrong even if both files were valid XML.&lt;/p&gt;
&lt;figure class="reader-figure reader-figure-wide"&gt;
&lt;div class="post-cover cover-reader"&gt;
&lt;img class="cover-image" src="https://figueirego-blog-images.s3.us-east-1.amazonaws.com/images/2026/10/building-blog-seo-rss/rss-real-en.webp" alt="Follow via RSS page showing the English feed URL and Copy address button." width="1512" height="893" loading="lazy" decoding="async"&gt;&lt;/div&gt;&lt;figcaption&gt;The public English RSS page presents the feed address for that language. Readers subscribe to this URL in their feed application.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href="https://figueirego-blog-images.s3.us-east-1.amazonaws.com/images/2026/10/building-blog-seo-rss/rss-real-en.webp" target="_blank" rel="noopener"&gt;View the full-size screenshot&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-hextra-search-id="what-the-feed-review-needed-to-check"&gt;What the feed review needed to check&lt;span class="hx:absolute hx:-mt-20" id="what-the-feed-review-needed-to-check"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The template starts with eligible publications and applies the section or topic scope before the fifty-item limit. A less frequent topic therefore does not disappear simply because the fifty newest articles overall cover other subjects.&lt;/p&gt;
&lt;p&gt;Drafts, samples, and unlisted content are excluded, as are future publication dates. In production, the filter also excludes content marked &lt;code&gt;noindex&lt;/code&gt;. That needs checking in the generated XML as well as in the template.&lt;/p&gt;
&lt;p&gt;Within an item, relative images and links need to keep working outside the website. An address relying on the current page can resolve incorrectly in a feed reader. Feed content resolves those references against the article&amp;rsquo;s URL and includes a cover when available.&lt;/p&gt;
&lt;p&gt;Dates have separate meanings too. &lt;code&gt;pubDate&lt;/code&gt; records publication and preserves the real offset, such as &lt;code&gt;-0300&lt;/code&gt;. When revising a published article, I set &lt;code&gt;lastmod&lt;/code&gt; to the date of that change:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Example of a revision after publication.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ld"&gt;2026-10-19T09:00:00&lt;/span&gt;&lt;span class="m"&gt;-03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;lastmod&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ld"&gt;2026-10-20T10:30:00&lt;/span&gt;&lt;span class="m"&gt;-03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
aria-label="Copy code"
data-copied-label="Copied"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The channel&amp;rsquo;s &lt;code&gt;lastBuildDate&lt;/code&gt; uses the latest modification date among its included items. In this project, editing a file without setting &lt;code&gt;lastmod&lt;/code&gt; does not automatically turn the commit date into an editorial date.&lt;/p&gt;
&lt;h2 data-hextra-search-id="keep-a-routine-i-can-repeat"&gt;Keep a routine I can repeat&lt;span class="hx:absolute hx:-mt-20" id="keep-a-routine-i-can-repeat"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Before publishing, I review the title and description, translation, links between parts, and cover metadata. After building, I check URLs, feeds, and which pages entered the publication. Once the version reaches the host, I check the served files.&lt;/p&gt;
&lt;p&gt;If I started again, I would organize design and architecture earlier, separating each technology and its purpose. Reviewing SEO and RSS reinforced that lesson: each output has its own job, but all of them need to tell the same story about the content.&lt;/p&gt;
&lt;p&gt;The website will keep changing. I want these decisions recorded so I can return to them when a tool, integration, or my own idea of a blog changes.&lt;/p&gt;
&lt;nav id="series-navigation" class="series-navigation" aria-label="Building my blog"&gt;
&lt;div class="series-heading"&gt;
&lt;h2&gt;Building my blog&lt;/h2&gt;
&lt;p&gt;Explore all 5 parts of the series.&lt;/p&gt;
&lt;/div&gt;
&lt;ol class="series-chapters" role="list"&gt;
&lt;li&gt;
&lt;a class="series-chapter" href="https://figueirego.com/blog/posts/building-the-blog-01-architecture/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;01&lt;/span&gt;
&lt;span class="series-title"&gt;Idea and architecture&lt;/span&gt;
&lt;svg width="20" height="20" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" d="M14 5l7 7m0 0l-7 7m7-7H3"/&gt;&lt;/svg&gt;
&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="series-chapter" href="https://figueirego.com/blog/posts/building-the-blog-02-reading/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;02&lt;/span&gt;
&lt;span class="series-title"&gt;Design and reading&lt;/span&gt;
&lt;svg width="20" height="20" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" d="M14 5l7 7m0 0l-7 7m7-7H3"/&gt;&lt;/svg&gt;
&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="series-chapter" href="https://figueirego.com/blog/posts/building-the-blog-03-publishing/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;03&lt;/span&gt;
&lt;span class="series-title"&gt;Publishing&lt;/span&gt;
&lt;svg width="20" height="20" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" d="M14 5l7 7m0 0l-7 7m7-7H3"/&gt;&lt;/svg&gt;
&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="series-chapter" href="https://figueirego.com/blog/posts/building-the-blog-04-images/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;04&lt;/span&gt;
&lt;span class="series-title"&gt;Images and automation&lt;/span&gt;
&lt;svg width="20" height="20" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" d="M14 5l7 7m0 0l-7 7m7-7H3"/&gt;&lt;/svg&gt;
&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;span class="series-chapter" aria-current="page"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;05&lt;/span&gt;
&lt;span class="series-title"&gt;SEO and RSS&lt;/span&gt;
&lt;span class="series-current"&gt;You are here&lt;/span&gt;
&lt;/span&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/nav&gt;</description></item></channel></rss>