<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Figueirego Blog – Bastidores do blog</title><link>https://figueirego.com/pt/blog/tags/bastidores-do-blog/</link><description>Publicações recentes em Bastidores do blog no Figueirego Blog.</description><generator>Hugo -- gohugo.io</generator><language>pt-BR</language><lastBuildDate>Mon, 19 Oct 2026 04:33:15 -0300</lastBuildDate><atom:link href="https://figueirego.com/pt/blog/tags/bastidores-do-blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Construindo meu blog, parte 5: SEO, idiomas e RSS</title><link>https://figueirego.com/pt/blog/posts/construindo-o-blog-05-seo-rss/</link><pubDate>Mon, 19 Oct 2026 04:15:50 -0300</pubDate><guid>https://figueirego.com/pt/blog/posts/construindo-o-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="Biblioteca com catálogo de fichas, livro aberto e uma janela voltada para casas iluminadas à noite."&gt;&lt;/p&gt;&lt;p&gt;Um artigo pode abrir normalmente no navegador e ainda se apresentar de forma errada em outros lugares. O título da busca pode ser genérico, a página em português pode anunciar o feed inglês ou um feed de um tema pode trazer todos os textos do blog.&lt;/p&gt;
&lt;p&gt;Ao revisar o site, passei a olhar também para essas saídas. O conteúdo publicado precisa continuar identificável quando aparece fora do layout que desenhei para ele.&lt;/p&gt;
&lt;h2 data-hextra-search-id="identidade-visível-e-metadados-têm-funções-próprias"&gt;Identidade visível e metadados têm funções próprias&lt;span class="hx:absolute hx:-mt-20" id="identidade-visível-e-metadados-têm-funções-próprias"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Na tela, o título e a descrição ajudam a pessoa a entender onde chegou. Nos metadados, o site informa título, descrição, URL e outros dados usados por serviços externos. Esses campos precisam concordar sobre o conteúdo da página, mas não precisam repetir a marca em cada frase visível.&lt;/p&gt;
&lt;p&gt;No projeto, os artigos usam dados editoriais para gerar metadados sociais e informações estruturadas. A revisão começa no texto: um título específico, uma descrição que explique o assunto e seções que desenvolvam o que foi prometido. Não faz sentido acrescentar termos de busca que o artigo não explica.&lt;/p&gt;
&lt;p&gt;Cada parte desta série tem um foco: arquitetura, leitura, publicação, imagens ou descoberta. Os links entre elas ajudam o leitor a seguir a história sem transformar cinco textos em cinco variações da mesma introdução.&lt;/p&gt;
&lt;h2 data-hextra-search-id="dois-idiomas-precisam-de-endereços-claros"&gt;Dois idiomas precisam de endereços claros&lt;span class="hx:absolute hx:-mt-20" id="dois-idiomas-precisam-de-endereços-claros"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;O artigo em inglês fica sob &lt;code&gt;/blog/&lt;/code&gt;; o português, sob &lt;code&gt;/pt/blog/&lt;/code&gt;. A &lt;code&gt;translationKey&lt;/code&gt; relaciona os arquivos, enquanto os metadados de idioma apontam para as páginas equivalentes.&lt;/p&gt;
&lt;p&gt;Uma URL canônica informa qual endereço representa aquela página. &lt;code&gt;hreflang&lt;/code&gt; indica alternativas de idioma. A versão portuguesa não deve tratar a inglesa como se fosse a única página principal e descartar sua própria identidade. As duas versões precisam de links coerentes e correspondentes.&lt;/p&gt;
&lt;p&gt;A &lt;a href="https://developers.google.com/search/docs/specialty/international/localized-versions" target="_blank" rel="noopener"&gt;documentação de versões localizadas do Google&lt;/a&gt; explica a relação entre essas alternativas. No meu fluxo, a validação dos arquivos gerados ajuda a encontrar links de tradução incorretos antes da publicação.&lt;/p&gt;
&lt;p&gt;O sitemap também deve refletir o que está disponível ao público. Rascunhos ficam fora da publicação normal, e uma prévia não deve ser usada como se fosse o endereço definitivo.&lt;/p&gt;
&lt;h2 data-hextra-search-id="solicitar-indexação-não-comprova-o-resultado"&gt;Solicitar indexação não comprova o resultado&lt;span class="hx:absolute hx:-mt-20" id="solicitar-indexação-não-comprova-o-resultado"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;No Search Console, há etapas diferentes que podem parecer uma só quando se olha apenas uma mensagem de sucesso:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evidência&lt;/th&gt;
&lt;th&gt;O que permite concluir&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pedido aceito&lt;/td&gt;
&lt;td&gt;A solicitação foi recebida.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Página já indexada&lt;/td&gt;
&lt;td&gt;Existe uma versão da página no índice.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Novo rastreamento&lt;/td&gt;
&lt;td&gt;O Google voltou a consultar a página.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resultado exibido na busca&lt;/td&gt;
&lt;td&gt;É possível observar como ela apareceu naquela consulta.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Um rastreamento depois de uma alteração não demonstra, sozinho, que a descrição nova foi adotada no resultado. Também não garante posição para uma palavra-chave. O próprio Google informa que &lt;a href="https://developers.google.com/search/docs/crawling-indexing/ask-google-to-recrawl" target="_blank" rel="noopener"&gt;solicitar novo rastreamento não garante inclusão imediata nem inclusão no índice&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;O projeto tem uma rotina de leitura do estado de indexação das páginas principais. Essa consulta serve para acompanhar mudanças e falhas; ela não equivale a enviar um novo pedido nem acompanha automaticamente todo artigo que eu venha a publicar. O conjunto monitorado precisa ser revisto conforme o site cresce.&lt;/p&gt;
&lt;h2 data-hextra-search-id="rss-é-outra-apresentação-do-mesmo-conteúdo"&gt;RSS é outra apresentação do mesmo conteúdo&lt;span class="hx:absolute hx:-mt-20" id="rss-é-outra-apresentação-do-mesmo-conteúdo"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;RSS permite acompanhar publicações em um leitor de feeds. A pessoa assina um endereço e recebe os itens sem precisar visitar a home para descobrir se apareceu algo novo.&lt;/p&gt;
&lt;p&gt;Aqui, o feed geral em português fica em &lt;code&gt;/pt/blog/index.xml&lt;/code&gt;; o inglês, em &lt;code&gt;/blog/index.xml&lt;/code&gt;. Páginas de temas e seções também podem ter feeds próprios. O escopo precisa corresponder à página: se o leitor assina um tema, espera receber publicações daquele tema.&lt;/p&gt;
&lt;p&gt;A identificação aparece em duas camadas. O HTML anuncia o feed pelo link de descoberta, e o próprio XML informa título, idioma, link e sua URL &lt;code&gt;self&lt;/code&gt;. Uma página em português anunciando o feed inglês seria uma falha mesmo que os dois arquivos fossem XML válido.&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-pt.webp" alt="Página Acompanhe por RSS com a URL do feed em português e o botão Copiar endereço." width="1512" height="893" loading="lazy" decoding="async"&gt;&lt;/div&gt;&lt;figcaption&gt;A página pública de RSS em português apresenta o endereço correspondente ao idioma. O leitor assina essa URL em seu aplicativo de feeds.&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-pt.webp" target="_blank" rel="noopener"&gt;Ver captura em tamanho original&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-hextra-search-id="o-que-a-revisão-do-feed-precisou-conferir"&gt;O que a revisão do feed precisou conferir&lt;span class="hx:absolute hx:-mt-20" id="o-que-a-revisão-do-feed-precisou-conferir"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;O template parte das publicações elegíveis e aplica o recorte da seção ou do tema antes do limite de cinquenta itens. Assim, um tema menos frequente não desaparece simplesmente porque os cinquenta textos gerais mais recentes são de outros assuntos.&lt;/p&gt;
&lt;p&gt;Rascunhos, demonstrações e conteúdo não listado ficam fora; datas futuras também são excluídas. Em produção, o filtro respeita ainda a exclusão de conteúdo marcado como &lt;code&gt;noindex&lt;/code&gt;. Isso precisa ser verificado no XML gerado, além de revisar o template.&lt;/p&gt;
&lt;p&gt;Dentro do item, imagens e links relativos precisam continuar funcionando fora do site. Um endereço que depende da página atual pode resolver incorretamente no leitor de RSS. O conteúdo do feed resolve essas referências contra a URL do artigo e inclui a capa quando ela existe.&lt;/p&gt;
&lt;p&gt;As datas também têm significados separados. &lt;code&gt;pubDate&lt;/code&gt; registra a publicação e preserva o deslocamento real, como &lt;code&gt;-0300&lt;/code&gt;. Ao revisar um texto publicado, informo &lt;code&gt;lastmod&lt;/code&gt; com a data da alteração:&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;# Exemplo de uma revisão posterior à publicação.&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="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado"
&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;O &lt;code&gt;lastBuildDate&lt;/code&gt; do canal considera a maior data de modificação dos itens incluídos. Neste projeto, editar o arquivo sem preencher &lt;code&gt;lastmod&lt;/code&gt; não transforma automaticamente a data do commit em data editorial.&lt;/p&gt;
&lt;h2 data-hextra-search-id="manter-uma-rotina-que-eu-consiga-repetir"&gt;Manter uma rotina que eu consiga repetir&lt;span class="hx:absolute hx:-mt-20" id="manter-uma-rotina-que-eu-consiga-repetir"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Antes de publicar, reviso título e descrição, tradução, links entre as partes e dados da capa. Depois do build, confiro URLs, feeds e o conjunto de páginas que entrou na publicação. Quando a versão chega à hospedagem, verifico os arquivos servidos.&lt;/p&gt;
&lt;p&gt;Se eu começasse novamente, organizaria design e arquitetura mais cedo, separando cada tecnologia e seu propósito. A revisão de SEO e RSS reforçou esse aprendizado: cada saída tem um trabalho próprio, mas todas precisam contar a mesma história sobre o conteúdo.&lt;/p&gt;
&lt;p&gt;O site continuará mudando. Quero que essas decisões fiquem registradas para poder voltar a elas quando uma ferramenta, uma integração ou a minha própria ideia de blog mudar.&lt;/p&gt;
&lt;nav id="series-navigation" class="series-navigation" aria-label="Construindo meu blog"&gt;
&lt;div class="series-heading"&gt;
&lt;h2&gt;Construindo meu blog&lt;/h2&gt;
&lt;p&gt;Explore as 5 partes da série.&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/pt/blog/posts/construindo-o-blog-01-arquitetura/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;01&lt;/span&gt;
&lt;span class="series-title"&gt;Ideia e arquitetura&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/pt/blog/posts/construindo-o-blog-02-leitura/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;02&lt;/span&gt;
&lt;span class="series-title"&gt;Design e leitura&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/pt/blog/posts/construindo-o-blog-03-publicacao/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;03&lt;/span&gt;
&lt;span class="series-title"&gt;Publicação&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/pt/blog/posts/construindo-o-blog-04-imagens/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;04&lt;/span&gt;
&lt;span class="series-title"&gt;Imagens e automação&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 e RSS&lt;/span&gt;
&lt;span class="series-current"&gt;Você está aqui&lt;/span&gt;
&lt;/span&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/nav&gt;</description></item><item><title>Construindo meu blog, parte 4: imagens no S3 pelo Finder</title><link>https://figueirego.com/pt/blog/posts/construindo-o-blog-04-imagens/</link><pubDate>Mon, 19 Oct 2026 04:15:50 -0300</pubDate><guid>https://figueirego.com/pt/blog/posts/construindo-o-blog-04-imagens/</guid><description>&lt;p&gt;&lt;img src="https://figueirego-blog-images.s3.us-east-1.amazonaws.com/images/2026/10/building-blog-images/imagens.webp" alt="Fotografias organizadas sobre uma mesa, gavetas de arquivo e um computador com prévias de imagens."&gt;&lt;/p&gt;&lt;p&gt;Selecionar uma imagem, usar o botão direito e receber uma URL pronta para o artigo. Era esse o tipo de facilidade que eu queria trazer para a rotina do blog. A automação da AWS foi a parte mais trabalhosa depois do design.&lt;/p&gt;
&lt;p&gt;O caminho começou com um auxiliar de upload e chegou a uma Ação Rápida no Finder. O caso feliz era simples de descrever. O trabalho apareceu nas perguntas seguintes: o que acontece quando a sessão expira, quando eu desisto do login ou quando o envio falha?&lt;/p&gt;
&lt;h2 data-hextra-search-id="páginas-na-hostinger-imagens-no-s3"&gt;Páginas na Hostinger, imagens no S3&lt;span class="hx:absolute hx:-mt-20" id="páginas-na-hostinger-imagens-no-s3"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;O S3 armazena objetos: neste caso, os arquivos das imagens. As páginas continuam na Hostinger. O Markdown guarda a URL pública do arquivo e o navegador busca a imagem nesse endereço.&lt;/p&gt;
&lt;p&gt;Isso separa o envio da imagem do build do site. Colocar um arquivo no repositório não executa um upload para a AWS. Também existem assets locais que acompanham o build; o fluxo das novas imagens editoriais usa o S3.&lt;/p&gt;
&lt;p&gt;Uma URL de imagem publicada precisa continuar funcionando quando minha sessão termina. Por isso, o endereço usado no artigo não é um link assinado temporário. O prefixo das imagens tem leitura pública configurada, enquanto a escrita exige autenticação. O script de envio não transforma qualquer bucket privado em público.&lt;/p&gt;
&lt;h2 data-hextra-search-id="o-que-chamo-de-versões-das-imagens"&gt;O que chamo de versões das imagens&lt;span class="hx:absolute hx:-mt-20" id="o-que-chamo-de-versões-das-imagens"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Cada envio recebe um nome novo, com ano, mês, nome normalizado e um identificador. Um caminho ilustrativo seria:&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-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;images/2026/10/minha-capa-identificador-unico.webp&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="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado"
&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;Se corrigir uma capa, envio outro arquivo e atualizo a referência no artigo. A imagem anterior continua disponível até ser removida. Isso ajuda a evitar que uma URL com cache longo passe a representar outro arquivo sem controle.&lt;/p&gt;
&lt;p&gt;Esse mecanismo é diferente do &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html" target="_blank" rel="noopener"&gt;S3 Versioning&lt;/a&gt;, que mantém versões de um mesmo objeto dentro do bucket. Aqui estou descrevendo novas chaves e novas URLs. Não basta ter dois arquivos para afirmar que o recurso nativo de versionamento está ativado.&lt;/p&gt;
&lt;p&gt;O histórico do Git registra as alterações na referência do artigo. Ele não é, por si só, um backup dos arquivos externos. Preservar e recuperar as imagens exige cuidar também do armazenamento delas.&lt;/p&gt;
&lt;h2 data-hextra-search-id="um-usuário-dedicado-ao-envio"&gt;Um usuário dedicado ao envio&lt;span class="hx:absolute hx:-mt-20" id="um-usuário-dedicado-ao-envio"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;O atalho usa um perfil da AWS CLI com credenciais temporárias de um usuário dedicado. Não depende da sessão root e não guarda uma chave permanente dentro do projeto.&lt;/p&gt;
&lt;p&gt;A conta e as permissões são preparadas antes. O auxiliar usa esse destino existente; não provisiona um ambiente AWS inteiro. O &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sign-in.html" target="_blank" rel="noopener"&gt;login local pelo navegador da AWS CLI&lt;/a&gt; permite renovar a autenticação sem colocar senha ou código no artigo, no script ou em uma conversa.&lt;/p&gt;
&lt;p&gt;No projeto configurado, a instalação da Ação Rápida parte da raiz:&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 blog/scripts/install-finder-upload.py&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="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado"
&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;Esse comando pertence ao repositório privado e requer o ambiente descrito acima. Ele não é um instalador público universal para qualquer conta AWS. Para reproduzir a ideia, é preciso adaptar destino, perfil e permissões ao próprio ambiente.&lt;/p&gt;
&lt;h2 data-hextra-search-id="a-rotina-no-finder"&gt;A rotina no Finder&lt;span class="hx:absolute hx:-mt-20" id="a-rotina-no-finder"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Com a ação instalada, seleciono a imagem e uso &lt;strong&gt;Ações Rápidas → Enviar imagem ao S3 — Figueirego&lt;/strong&gt;. Após o envio, a ação copia a URL e apresenta a notificação de conclusão. Não preciso abrir o Terminal para a rotina normal.&lt;/p&gt;
&lt;p&gt;Se a sessão expirou, o atalho abre a autenticação no navegador e aguarda a conclusão. Depois do login autorizado, continua o envio. Foi importante testar o caminho completo pelo Finder: executar o auxiliar no Terminal não demonstraria, sozinho, que o aviso aparecia pela ação do macOS.&lt;/p&gt;
&lt;p&gt;Também conferimos a URL pública e a imagem recebida. Uma mensagem de conclusão ajuda, mas não substitui verificar se o arquivo certo está acessível fora da sessão AWS.&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-images/finder-acao-real.webp" alt="Menu de Ações Rápidas do Finder com Enviar imagem ao S3 — Figueirego." width="1840" height="872" loading="lazy" decoding="async"&gt;&lt;/div&gt;&lt;figcaption&gt;A ação instalada no Finder, acessível pelo botão direito sobre a imagem. O menu foi aberto para esta captura, sem executar outro upload.&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-images/finder-acao-real.webp" target="_blank" rel="noopener"&gt;Ver captura em tamanho original&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-hextra-search-id="cancelar-também-faz-parte-da-interface"&gt;Cancelar também faz parte da interface&lt;span class="hx:absolute hx:-mt-20" id="cancelar-também-faz-parte-da-interface"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Esperar cinco minutos para descobrir que um login foi abandonado era ruim. A espera ganhou uma janela com &lt;strong&gt;Cancelar envio&lt;/strong&gt;, para encerrar aquela tentativa de forma explícita.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situação&lt;/th&gt;
&lt;th&gt;Comportamento esperado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sessão válida&lt;/td&gt;
&lt;td&gt;Enviar, copiar a URL e avisar a conclusão.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sessão expirada&lt;/td&gt;
&lt;td&gt;Abrir o login e continuar depois de autenticar.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cancelamento enquanto aguarda login&lt;/td&gt;
&lt;td&gt;Avisar, não enviar a imagem e preservar o conteúdo copiado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nova tentativa após cancelar&lt;/td&gt;
&lt;td&gt;Permitir iniciar o fluxo novamente.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Fechar apenas a aba do navegador não equivale a apertar o botão de cancelamento. E esse botão cancela a espera pela autenticação; ele não promete interromper um upload que já começou.&lt;/p&gt;
&lt;p&gt;Testamos a espera primeiro com uma AWS simulada e depois com login real. As duas verificações respondem a perguntas diferentes: a simulação ajuda a controlar o cenário; o teste real confirma a integração que será usada.&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-images/finder-pt.webp" alt="Da imagem no Finder à URL copiada. O cancelamento durante o login encerra o fluxo antes do envio." width="1200" height="1000" loading="lazy" decoding="async"&gt;&lt;/div&gt;&lt;figcaption&gt;Da imagem no Finder à URL copiada. O cancelamento durante o login encerra o fluxo antes do envio.&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-images/finder-pt.webp" target="_blank" rel="noopener"&gt;Abrir diagrama em tamanho original&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-hextra-search-id="o-que-ainda-precisa-de-cuidado"&gt;O que ainda precisa de cuidado&lt;span class="hx:absolute hx:-mt-20" id="o-que-ainda-precisa-de-cuidado"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Não removo automaticamente uma imagem antiga só porque enviei outra. Ela pode continuar referenciada por um rascunho, por outro texto ou por um feed já recebido. A limpeza precisa considerar essas referências.&lt;/p&gt;
&lt;p&gt;Se o upload concluir, mas a cópia para a área de transferência falhar, isso também não desfaz o objeto enviado. É preciso distinguir falha de envio de falha na última etapa da conveniência, para não repetir uploads sem necessidade.&lt;/p&gt;
&lt;p&gt;A automação tornou a rotina mais curta. O aprendizado foi dedicar atenção também aos caminhos de desistência e recuperação: uma ferramenta simples de usar precisa explicar quando terminou, quando falhou e o que aconteceu com o arquivo.&lt;/p&gt;
&lt;nav id="series-navigation" class="series-navigation" aria-label="Construindo meu blog"&gt;
&lt;div class="series-heading"&gt;
&lt;h2&gt;Construindo meu blog&lt;/h2&gt;
&lt;p&gt;Explore as 5 partes da série.&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/pt/blog/posts/construindo-o-blog-01-arquitetura/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;01&lt;/span&gt;
&lt;span class="series-title"&gt;Ideia e arquitetura&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/pt/blog/posts/construindo-o-blog-02-leitura/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;02&lt;/span&gt;
&lt;span class="series-title"&gt;Design e leitura&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/pt/blog/posts/construindo-o-blog-03-publicacao/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;03&lt;/span&gt;
&lt;span class="series-title"&gt;Publicação&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;04&lt;/span&gt;
&lt;span class="series-title"&gt;Imagens e automação&lt;/span&gt;
&lt;span class="series-current"&gt;Você está aqui&lt;/span&gt;
&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="series-chapter" href="https://figueirego.com/pt/blog/posts/construindo-o-blog-05-seo-rss/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;05&lt;/span&gt;
&lt;span class="series-title"&gt;SEO e RSS&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;/ol&gt;
&lt;/nav&gt;</description></item><item><title>Construindo meu blog, parte 3: do Markdown à publicação</title><link>https://figueirego.com/pt/blog/posts/construindo-o-blog-03-publicacao/</link><pubDate>Mon, 19 Oct 2026 04:15:50 -0300</pubDate><guid>https://figueirego.com/pt/blog/posts/construindo-o-blog-03-publicacao/</guid><description>&lt;p&gt;&lt;img src="https://figueirego-blog-images.s3.us-east-1.amazonaws.com/images/2026/10/building-blog-publishing/publicacao.webp" alt="Oficina de encadernação com prensa, folhas organizadas e cadernos prontos sobre a bancada."&gt;&lt;/p&gt;&lt;p&gt;Salvar um artigo no editor não significa que ele está publicado. O texto ainda precisa ser revisado, gerar uma página, passar pelas verificações e chegar à hospedagem. Depois disso, preciso abrir o endereço público e conferir o que o leitor recebeu.&lt;/p&gt;
&lt;p&gt;Essa distinção ficou importante ao integrar blog e portfólio. Na primeira versão, o blog tinha um fluxo separado. Hoje, as duas partes saem do mesmo repositório e são entregues pela aplicação Next.js na Hostinger. O subdomínio antigo deixou de ser o destino.&lt;/p&gt;
&lt;h2 data-hextra-search-id="o-artigo-começa-com-texto-e-metadados"&gt;O artigo começa com texto e metadados&lt;span class="hx:absolute hx:-mt-20" id="o-artigo-começa-com-texto-e-metadados"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Escrevo em Markdown. Antes do corpo, um bloco de dados chamado &lt;em&gt;front matter&lt;/em&gt; informa como o artigo deve ser apresentado. Este é um exemplo reduzido, não um arquivo pronto para publicar:&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="nn"&gt;---&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;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Como organizei meu blog&amp;#34;&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;draft&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Matheus Figueirêdo&amp;#34;&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;translationKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;how-i-organized-my-blog&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;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;As decisões para organizar conteúdo, navegação e publicação.&amp;#34;&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;tags&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;&amp;#34;Hugo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;publicação&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&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="nn"&gt;---&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="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado"
&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;A data precisa corresponder à publicação real. &lt;code&gt;draft: true&lt;/code&gt; mantém o texto fora do build público. Na tradução, o título, a descrição, os temas e o corpo mudam; a &lt;code&gt;translationKey&lt;/code&gt; continua igual.&lt;/p&gt;
&lt;p&gt;Uma capa pode ser acrescentada depois. Quando existe, precisa de URL, descrição alternativa e dimensões correspondentes ao arquivo. O artigo deve continuar legível sem depender da imagem para informar seu assunto.&lt;/p&gt;
&lt;h2 data-hextra-search-id="duas-prévias-para-perguntas-diferentes"&gt;Duas prévias para perguntas diferentes&lt;span class="hx:absolute hx:-mt-20" id="duas-prévias-para-perguntas-diferentes"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Para revisar apenas os textos, posso usar o servidor do Hugo. Estes comandos partem da raiz do repositório e pressupõem Hugo extended na versão fixada pelo projeto:&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; blog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server --buildDrafts --bind 127.0.0.1&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="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado"
&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;A opção inclui rascunhos na prévia local. É útil para conferir texto, sumário e tradução. Para avaliar a integração com o portfólio, uso o projeto completo, em outro terminal:&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; client
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm ci
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run dev&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="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado"
&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;Esse caminho pressupõe Node.js 24.12.0 ou superior e Hugo extended 0.167.0 no ambiente. O script de desenvolvimento monta o blog no início. Depois de editar Markdown, preciso reconstruir essa parte com &lt;code&gt;node scripts/build-blog.mjs --preview&lt;/code&gt; e recarregar a página. Ele não substitui o acompanhamento de arquivos do servidor Hugo dedicado, e o build integrado normal continua excluindo rascunhos.&lt;/p&gt;
&lt;p&gt;Os comandos dependem dos auxiliares deste repositório privado. Para outro projeto, a ideia reproduzível é manter uma prévia rápida do conteúdo e outra que exercite a integração completa.&lt;/p&gt;
&lt;h2 data-hextra-search-id="a-versão-que-passa-pelos-testes-é-a-que-segue-adiante"&gt;A versão que passa pelos testes é a que segue adiante&lt;span class="hx:absolute hx:-mt-20" id="a-versão-que-passa-pelos-testes-é-a-que-segue-adiante"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;O fluxo atual é:&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-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arquivos revisados → dev → main
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; testes e build integrado
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SHA aprovado → production
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Hostinger
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; conferência do site público&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="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado"
&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;SHA é o identificador de um commit. Usá-lo na promoção permite relacionar a versão testada à versão enviada para publicação. A CI não deve aprovar um commit e promover silenciosamente outro que chegou depois.&lt;/p&gt;
&lt;p&gt;O comando central de verificação, executado em &lt;code&gt;client/&lt;/code&gt;, é:&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;node scripts/verify-release.mjs --production&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="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado"
&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;Ele reúne checagem de tipos, lint, formatação, testes, build Next.js com Hugo e verificação dos arquivos gerados. Para conhecer as etapas sem executá-las, uso &lt;code&gt;--dry-run&lt;/code&gt;. Nenhuma dessas opções, sozinha, envia código ao GitHub.&lt;/p&gt;
&lt;p&gt;Depois dos checks da &lt;code&gt;main&lt;/code&gt;, a automação promove o commit aprovado para &lt;code&gt;production&lt;/code&gt;. A Hostinger acompanha essa branch. Se a &lt;code&gt;main&lt;/code&gt; avançou durante a execução, a versão nova precisa passar por sua própria verificação. A promoção não deve atropelar o histórico com um envio forçado.&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-publishing/publicacao-pt.webp" alt="Revisar, testar, publicar e conferir: as quatro etapas do fluxo de entrega deste site." width="1200" height="1000" loading="lazy" decoding="async"&gt;&lt;/div&gt;&lt;figcaption&gt;Revisar, testar, publicar e conferir: as quatro etapas do fluxo de entrega deste site.&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-publishing/publicacao-pt.webp" target="_blank" rel="noopener"&gt;Abrir diagrama em tamanho original&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-hextra-search-id="conferir-três-resultados-separados"&gt;Conferir três resultados separados&lt;span class="hx:absolute hx:-mt-20" id="conferir-três-resultados-separados"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Um check verde mostra o resultado da verificação. O deployment na Hostinger informa se a hospedagem conseguiu construir e iniciar a versão correspondente. Abrir as páginas públicas mostra o que está sendo entregue.&lt;/p&gt;
&lt;p&gt;Por isso, a conferência inclui os dois idiomas, os links do artigo, as imagens, o RSS e o caminho de volta ao restante do site. Também preciso olhar o SHA da implantação. Um código de resposta HTTP 200 não demonstra que todos os componentes da página funcionaram.&lt;/p&gt;
&lt;p&gt;Para conteúdo, há uma verificação adicional: confirmar que um rascunho não entrou na busca, no sitemap ou no feed. Uma prévia que inclui rascunhos não pode ser copiada para produção como se fosse o build público.&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-publishing/hostinger-deploy-real.webp" alt="Painel da Hostinger indicando implantação concluída da branch production, com Next.js e Node 24." width="1092" height="195" loading="lazy" decoding="async"&gt;&lt;/div&gt;&lt;figcaption&gt;Recorte real do deploy concluído em 19/10/2026, referente à publicação inicial desta série com as capas. A hospedagem identifica o commit que recebeu.&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-publishing/hostinger-deploy-real.webp" target="_blank" rel="noopener"&gt;Ver captura em tamanho original&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-hextra-search-id="os-mais-lidos-também-passam-por-publicação"&gt;Os mais lidos também passam por publicação&lt;span class="hx:absolute hx:-mt-20" id="os-mais-lidos-também-passam-por-publicação"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;O GoatCounter fornece estatísticas de visitas. Uma rotina no GitHub consulta esses dados e grava um snapshot em &lt;code&gt;blog/data/popular.json&lt;/code&gt;. O build incorpora esse resultado e entrega um arquivo público em &lt;code&gt;/blog/popular.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;O navegador pode atualizar as listas a partir desse arquivo, sem receber o token de consulta ao GoatCounter. A rotina de coleta tem execução diária e tentativas de recuperação. Horários agendados dependem dos provedores; não são uma garantia de atualização no segundo marcado.&lt;/p&gt;
&lt;p&gt;Semana e mês representam os sete e trinta dias completos anteriores, em UTC. As versões de um mesmo artigo são agregadas pela identidade editorial. Isso conta visitas registradas, não pessoas únicas entre idiomas nem prova de leitura completa.&lt;/p&gt;
&lt;p&gt;Quando a coleta falha, o fluxo conserva o snapshot anterior em vez de publicar números inventados. Uma atualização válida ainda precisa passar pela verificação e chegar à hospedagem. Monitorar o JSON público ajuda a detectar a diferença entre ter coletado dados e ter publicado esses dados.&lt;/p&gt;
&lt;p&gt;Essa rotina faz parte do custo de manter o site. Automatizar ajuda, mas o resultado importante continua sendo o conteúdo correto no endereço que a pessoa abre.&lt;/p&gt;
&lt;nav id="series-navigation" class="series-navigation" aria-label="Construindo meu blog"&gt;
&lt;div class="series-heading"&gt;
&lt;h2&gt;Construindo meu blog&lt;/h2&gt;
&lt;p&gt;Explore as 5 partes da série.&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/pt/blog/posts/construindo-o-blog-01-arquitetura/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;01&lt;/span&gt;
&lt;span class="series-title"&gt;Ideia e arquitetura&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/pt/blog/posts/construindo-o-blog-02-leitura/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;02&lt;/span&gt;
&lt;span class="series-title"&gt;Design e leitura&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;03&lt;/span&gt;
&lt;span class="series-title"&gt;Publicação&lt;/span&gt;
&lt;span class="series-current"&gt;Você está aqui&lt;/span&gt;
&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="series-chapter" href="https://figueirego.com/pt/blog/posts/construindo-o-blog-04-imagens/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;04&lt;/span&gt;
&lt;span class="series-title"&gt;Imagens e automação&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/pt/blog/posts/construindo-o-blog-05-seo-rss/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;05&lt;/span&gt;
&lt;span class="series-title"&gt;SEO e RSS&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;/ol&gt;
&lt;/nav&gt;</description></item><item><title>Construindo meu blog, parte 2: design para entender e explorar</title><link>https://figueirego.com/pt/blog/posts/construindo-o-blog-02-leitura/</link><pubDate>Mon, 19 Oct 2026 04:15:50 -0300</pubDate><guid>https://figueirego.com/pt/blog/posts/construindo-o-blog-02-leitura/</guid><description>&lt;p&gt;&lt;img src="https://figueirego-blog-images.s3.us-east-1.amazonaws.com/images/2026/10/building-blog-reading/design-leitura.webp" alt="Canto de leitura com poltrona, livro aberto e um computador junto à janela à noite."&gt;&lt;/p&gt;&lt;p&gt;O terminal antigo fazia sentido para mim, mas podia exigir demais de quem visitava. Uma pessoa procurando conhecer meu trabalho não deveria precisar descobrir um comando para encontrar uma informação. Ao adaptar essa área para um desktop, quis aproveitar uma linguagem mais familiar: abrir, explorar e fechar janelas.&lt;/p&gt;
&lt;p&gt;Isso não resolveu o design inteiro. Um desktop também pode confundir se tudo depender dele. O site tem páginas próprias para apresentação, projetos, textos e contato; a área interativa é uma possibilidade de exploração. O caminho convencional continua disponível.&lt;/p&gt;
&lt;p&gt;Acertar essa combinação foi a parte mais trabalhosa da construção. Eu queria que o site transmitisse minha imagem e que a pessoa entendesse o que estava vendo. A aparência precisava ajudar nessa leitura.&lt;/p&gt;
&lt;h2 data-hextra-search-id="uma-referência-para-apresentar-outra-para-construir"&gt;Uma referência para apresentar, outra para construir&lt;span class="hx:absolute hx:-mt-20" id="uma-referência-para-apresentar-outra-para-construir"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;No Zeno Rocha, me chamou a atenção a maneira de se apresentar e dar visibilidade ao próprio trabalho mantendo a navegação intuitiva. No Akita, a referência foi principalmente a construção do blog e suas ideias. Não eram duas interfaces que eu pretendia juntar literalmente.&lt;/p&gt;
&lt;p&gt;Ao experimentar com Claude, Antigravity e depois Codex com skills, fui refinando uma proposta que precisava combinar com o restante do meu site. Um resultado visual interessante ainda podia ter espaçamento ruim, informação demais no mesmo lugar ou uma interação pouco clara.&lt;/p&gt;
&lt;p&gt;Isso apareceu especialmente nas capas dos artigos. Eu queria conservar título, resumo, autor, data, tempo de leitura e temas. Quando essas informações ficaram muito juntas, a imagem grande não compensou a falta de hierarquia. O degradê também precisou de revisão: uma transição que parecia aceitável no tema escuro podia formar uma faixa pesada no claro.&lt;/p&gt;
&lt;h2 data-hextra-search-id="dar-uma-função-a-cada-área"&gt;Dar uma função a cada área&lt;span class="hx:absolute hx:-mt-20" id="dar-uma-função-a-cada-área"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Os destaques apresentam uma seleção de até três textos. Os recentes mostram o que foi publicado por último e podem repetir um destaque. O Arquivo oferece um caminho para explorar mais conteúdo e filtrar o que interessa.&lt;/p&gt;
&lt;p&gt;Os temas aparecem como pequenos rótulos, sem o símbolo de hashtag. O rótulo comunica uma categoria; a aparência precisa continuar reconhecível como algo em que se pode clicar. Da mesma forma, um link de retorno deve dizer para onde leva. Um texto que promete voltar ao Arquivo precisa realmente levar ao Arquivo.&lt;/p&gt;
&lt;p&gt;Esse tipo de detalhe parece pequeno quando avaliado sozinho. Junto, ele determina se a pessoa consegue prever o próximo passo. Meu critério passou a ser observar a função de cada elemento, além da sua posição na captura de tela.&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-reading/arquivo-real-pt.webp" alt="Arquivo do blog com busca, filtros por formato e ano e lista de temas." width="1512" height="893" loading="lazy" decoding="async"&gt;&lt;/div&gt;&lt;figcaption&gt;Prévia local do Arquivo em 19/10/2026: busca, filtros e temas têm funções distintas na navegação.&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-reading/arquivo-real-pt.webp" target="_blank" rel="noopener"&gt;Ver captura em tamanho original&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-hextra-search-id="movimento-precisa-acompanhar-a-ação"&gt;Movimento precisa acompanhar a ação&lt;span class="hx:absolute hx:-mt-20" id="movimento-precisa-acompanhar-a-ação"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;As imagens dos destaques ficam em preto e branco nos dispositivos com mouse e ganham cor ao passar o ponteiro. A primeira troca parecia direta demais. Ajustamos a transição para dar tempo de perceber a mudança, com uma ampliação discreta da imagem.&lt;/p&gt;
&lt;p&gt;O mesmo cuidado apareceu no sumário. Ao clicar do primeiro para o último tópico, o indicador não deveria disputar atenção com cada seção intermediária durante a rolagem. A navegação passou a tratar esse deslocamento como uma ação com um destino escolhido.&lt;/p&gt;
&lt;p&gt;Esses efeitos precisam ter alternativas. No celular, não existe um hover confiável como no mouse. Pelo teclado, o foco precisa aparecer sem depender de uma animação lenta. Para quem pede movimento reduzido no sistema, deslocamentos e transições devem ser reduzidos ou removidos. A preferência é lida com a media query &lt;code&gt;prefers-reduced-motion&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;O objetivo não é fazer o visitante esperar por um efeito para conseguir usar o site. O movimento deve explicar o que está mudando e permitir continuar a navegação.&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-reading/leitura-sumario-real-pt.webp" alt="Artigo em português com sumário lateral e a seção Além da programação selecionada." width="1512" height="893" loading="lazy" decoding="async"&gt;&lt;/div&gt;&lt;figcaption&gt;Captura real da leitura em português. O sumário mantém a seção selecionada visível ao lado do texto.&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-reading/leitura-sumario-real-pt.webp" target="_blank" rel="noopener"&gt;Ver captura em tamanho original&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-hextra-search-id="ler-em-português-ou-inglês"&gt;Ler em português ou inglês&lt;span class="hx:absolute hx:-mt-20" id="ler-em-português-ou-inglês"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;A versão em português do blog fica em &lt;code&gt;/pt/blog/&lt;/code&gt;; a inglesa, em &lt;code&gt;/blog/&lt;/code&gt;. Cada artigo tem um arquivo por idioma. A ligação entre eles usa a mesma &lt;code&gt;translationKey&lt;/code&gt;:&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;# Nos dois arquivos; o título e o texto são traduzidos.&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;translationKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;building-blog-reading&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="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado"
&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;O seletor leva à versão correspondente quando ela existe. Ele não traduz automaticamente o texto. Isso exige revisar também resumos, rótulos, texto alternativo das imagens e links entre as partes da série.&lt;/p&gt;
&lt;p&gt;A busca usa um índice local com texto, títulos e outros campos editoriais. Ela ajuda a localizar uma palavra dentro de um artigo; filtros do Arquivo ajudam a reduzir uma coleção por critérios. São tarefas próximas, mas não idênticas.&lt;/p&gt;
&lt;h2 data-hextra-search-id="comentários-reais-e-limites-do-teste"&gt;Comentários reais e limites do teste&lt;span class="hx:absolute hx:-mt-20" id="comentários-reais-e-limites-do-teste"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Mantive o Disqus existente. Botões de reação que guardavam apenas uma escolha no navegador não entregavam uma interação real comigo, então essa proposta ficou de fora.&lt;/p&gt;
&lt;p&gt;O carregamento dos comentários mostrou por que uma captura bonita não comprova funcionamento. Foi preciso revisar o domínio autorizado no Disqus e testar a abertura automática. Também houve interferência de ferramentas e mudanças de aba durante verificações. O diagnóstico precisava separar falha do serviço, configuração do site e problema no próprio teste.&lt;/p&gt;
&lt;p&gt;Em produção, os comentários tentam carregar automaticamente. O botão de tentar novamente é uma recuperação para falhas. Nas prévias, a integração de produção fica desativada para não misturar ensaios com conversas reais.&lt;/p&gt;
&lt;p&gt;Hoje eu revisaria uma tela percorrendo suas tarefas: encontrar um texto, trocar idioma, usar o sumário, voltar à listagem e localizar outro assunto. Repetiria isso com teclado, tema claro e escuro e uma largura de celular. Emulação ajuda a encontrar problemas de layout, mas não equivale a testar um aparelho físico. É esse uso que mostra se o design está cumprindo sua função.&lt;/p&gt;
&lt;nav id="series-navigation" class="series-navigation" aria-label="Construindo meu blog"&gt;
&lt;div class="series-heading"&gt;
&lt;h2&gt;Construindo meu blog&lt;/h2&gt;
&lt;p&gt;Explore as 5 partes da série.&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/pt/blog/posts/construindo-o-blog-01-arquitetura/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;01&lt;/span&gt;
&lt;span class="series-title"&gt;Ideia e arquitetura&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;02&lt;/span&gt;
&lt;span class="series-title"&gt;Design e leitura&lt;/span&gt;
&lt;span class="series-current"&gt;Você está aqui&lt;/span&gt;
&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="series-chapter" href="https://figueirego.com/pt/blog/posts/construindo-o-blog-03-publicacao/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;03&lt;/span&gt;
&lt;span class="series-title"&gt;Publicação&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/pt/blog/posts/construindo-o-blog-04-imagens/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;04&lt;/span&gt;
&lt;span class="series-title"&gt;Imagens e automação&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/pt/blog/posts/construindo-o-blog-05-seo-rss/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;05&lt;/span&gt;
&lt;span class="series-title"&gt;SEO e RSS&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;/ol&gt;
&lt;/nav&gt;</description></item><item><title>Construindo meu blog, parte 1: da landing page ao site</title><link>https://figueirego.com/pt/blog/posts/construindo-o-blog-01-arquitetura/</link><pubDate>Mon, 19 Oct 2026 04:15:50 -0300</pubDate><guid>https://figueirego.com/pt/blog/posts/construindo-o-blog-01-arquitetura/</guid><description>&lt;p&gt;&lt;img src="https://figueirego-blog-images.s3.us-east-1.amazonaws.com/images/2026/10/building-blog-architecture/arquitetura.webp" alt="Maquete de três construções sobre uma mesa de madeira, com desenhos de arquitetura e um caderno aberto."&gt;&lt;/p&gt;&lt;p&gt;Eu já tinha um projeto de site. Era uma landing page, com uma ideia que eu ainda queria manter, mas que precisava de mais espaço. Resolvi reaproveitar essa base, subdividir o conteúdo e melhorar a forma de apresentar meu trabalho e as coisas sobre as quais queria escrever.&lt;/p&gt;
&lt;p&gt;Uma das mudanças mais visíveis foi transformar uma experiência de terminal em um desktop. O terminal tinha uma linguagem muito voltada para quem programa. Eu queria que uma pessoa pudesse explorar o site sem precisar conhecer comandos. Janelas e ícones me pareceram um ponto de partida mais familiar, embora isso ainda precisasse funcionar bem na prática e no celular.&lt;/p&gt;
&lt;p&gt;O blog entrou nessa mesma construção. Meu receio ao juntar os dois era confundir a navegação e não conseguir ser claro sobre o que cada área oferecia. Por isso, esta série começa pela organização do projeto. O código veio acompanhado de decisões sobre comunicação.&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-architecture/desktop-real-pt.webp" alt="Desktop do portfólio com explorador, pastas e dock de aplicativos." width="1512" height="893" loading="lazy" decoding="async"&gt;&lt;/div&gt;&lt;figcaption&gt;O desktop real do portfólio: janelas e pastas como alternativa de exploração, mantendo a navegação convencional disponível.&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-architecture/desktop-real-pt.webp" target="_blank" rel="noopener"&gt;Ver captura em tamanho original&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-hextra-search-id="referências-com-papéis-diferentes"&gt;Referências com papéis diferentes&lt;span class="hx:absolute hx:-mt-20" id="referências-com-papéis-diferentes"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;O &lt;a href="https://akitaonrails.com/2025/09/10/meu-novo-blog-como-eu-fiz/" target="_blank" rel="noopener"&gt;blog do Akita&lt;/a&gt; me ajudou com a construção do blog e com ideias para a rotina de publicação. Já o &lt;a href="https://zenorocha.com/" target="_blank" rel="noopener"&gt;site do Zeno Rocha&lt;/a&gt; foi uma referência de apresentação: como mostrar o próprio trabalho e deixar a exploração intuitiva.&lt;/p&gt;
&lt;p&gt;Usei essas referências para estudar o que poderia melhorar, reaproveitar ou descartar. Eu tinha uma ideia própria para preservar e precisava entender quais soluções ajudavam a expressá-la. A parte mais trabalhosa acabou sendo acertar o design para transmitir essa identidade.&lt;/p&gt;
&lt;p&gt;As IAs participaram desse estudo. Concentrei mais no Codex a busca de informação e a investigação do projeto; usei Claude e Antigravity principalmente no design. Depois voltei ao Codex com skills para separar e aprofundar cada conceito. Essa divisão descreve meu processo, não uma regra sobre qual ferramenta qualquer pessoa deveria usar.&lt;/p&gt;
&lt;h2 data-hextra-search-id="onde-termina-o-site-e-começa-o-blog"&gt;Onde termina o site e começa o blog&lt;span class="hx:absolute hx:-mt-20" id="onde-termina-o-site-e-começa-o-blog"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Hoje, o portfólio usa Next.js, React e TypeScript. Os artigos ficam em Markdown e são gerados pelo Hugo. O Hextra serve como base do tema, com personalizações em arquivos do projeto.&lt;/p&gt;
&lt;p&gt;O Hugo é um gerador: lê o texto e seus metadados e produz HTML, CSS, JavaScript e índices. O Next.js reúne esse resultado com as páginas do portfólio. A Hostinger executa a aplicação Next.js e entrega o conjunto no mesmo domínio.&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-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog/content/ → Hugo → páginas, busca e feeds do blog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; client/public/blog/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; client/public/pt/blog/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Next.js + páginas do portfólio → Hostinger&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="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado"
&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;Isso corrige uma descrição da primeira versão do projeto, quando o blog estava separado. O conjunto atual tem um servidor Next.js em produção; o Hugo só roda na geração dos arquivos. Os artigos não precisam de uma API própria de edição ou de um banco de dados para montar seu conteúdo a cada visita.&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-architecture/arquitetura-pt.webp" alt="Markdown passa pelo Hugo; arquivos gerados são integrados ao Next.js e entregues pela Hostinger." width="1200" height="1000" loading="lazy" decoding="async"&gt;&lt;/div&gt;&lt;figcaption&gt;Markdown passa pelo Hugo; arquivos gerados são integrados ao Next.js e entregues pela Hostinger.&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-architecture/arquitetura-pt.webp" target="_blank" rel="noopener"&gt;Abrir diagrama em tamanho original&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-hextra-search-id="cada-tecnologia-precisa-ter-um-trabalho-claro"&gt;Cada tecnologia precisa ter um trabalho claro&lt;span class="hx:absolute hx:-mt-20" id="cada-tecnologia-precisa-ter-um-trabalho-claro"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Componente&lt;/th&gt;
&lt;th&gt;Responsabilidade neste projeto&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;td&gt;Texto, resumo, data, idioma e demais dados editoriais.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hugo e Hextra&lt;/td&gt;
&lt;td&gt;Geração do blog e base dos layouts.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next.js&lt;/td&gt;
&lt;td&gt;Páginas do portfólio e entrega integrada do site.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub e Actions&lt;/td&gt;
&lt;td&gt;Histórico do código e conteúdo, testes e preparação da publicação.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hostinger&lt;/td&gt;
&lt;td&gt;Build e execução da versão publicada.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon S3&lt;/td&gt;
&lt;td&gt;Armazenamento das imagens enviadas separadamente.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disqus&lt;/td&gt;
&lt;td&gt;Conversas e moderação dos comentários.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GoatCounter&lt;/td&gt;
&lt;td&gt;Estatísticas de visitas que alimentam os mais lidos.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Não acrescentei um banco de dados só para guardar os artigos. Também não coloquei o armazenamento das imagens dentro da responsabilidade do Hugo. Essa separação ajuda a encontrar problemas: uma imagem indisponível, um artigo ausente e um comentário que não carrega podem ter causas diferentes.&lt;/p&gt;
&lt;h2 data-hextra-search-id="organização-que-dá-para-enxergar-nos-arquivos"&gt;Organização que dá para enxergar nos arquivos&lt;span class="hx:absolute hx:-mt-20" id="organização-que-dá-para-enxergar-nos-arquivos"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;A estrutura principal ficou assim:&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-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;client/ aplicação Next.js
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog/content/pt/ conteúdo em português
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog/content/en/ conteúdo em inglês
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog/layouts/ personalizações de layout
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog/assets/ estilos e interações
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog/themes/hextra/ tema de base
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog/scripts/ auxiliares de publicação e imagens
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.github/workflows/ verificações e automações do conjunto&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="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado"
&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;As personalizações ficam fora da pasta do tema. Isso facilita revisar uma atualização sem misturar cada ajuste local ao código original do Hextra. Continua sendo necessário testar a atualização; a estrutura de pastas não garante compatibilidade.&lt;/p&gt;
&lt;p&gt;O repositório ativo é privado. O resultado publicado, incluindo artigos, imagens e scripts enviados ao navegador, é público. O leitor não precisa acessar o repositório para usar o site, mas os comandos desta série são exemplos do meu projeto, não um pacote público pronto para clonar.&lt;/p&gt;
&lt;h2 data-hextra-search-id="o-que-eu-organizaria-antes-de-começar"&gt;O que eu organizaria antes de começar&lt;span class="hx:absolute hx:-mt-20" id="o-que-eu-organizaria-antes-de-começar"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Se começasse hoje, olharia melhor para o design e a arquitetura antes de implementar. Separaria cada responsabilidade, o propósito de cada área e o papel das tecnologias. Fui descobrindo parte dessa organização enquanto construía.&lt;/p&gt;
&lt;p&gt;Para um projeto parecido, eu começaria escrevendo o caminho do visitante: onde ele entende quem sou, onde encontra meus projetos e onde lê os textos. Depois desenharia o percurso de um artigo até a publicação. Esses dois mapas ajudam a perceber quais partes precisam conversar e quais podem continuar independentes.&lt;/p&gt;
&lt;p&gt;Na próxima parte, entro no ponto que mais exigiu tentativas: fazer essa organização aparecer na interface, sem obrigar quem chega a entender a arquitetura do projeto.&lt;/p&gt;
&lt;nav id="series-navigation" class="series-navigation" aria-label="Construindo meu blog"&gt;
&lt;div class="series-heading"&gt;
&lt;h2&gt;Construindo meu blog&lt;/h2&gt;
&lt;p&gt;Explore as 5 partes da série.&lt;/p&gt;
&lt;/div&gt;
&lt;ol class="series-chapters" role="list"&gt;
&lt;li&gt;
&lt;span class="series-chapter" aria-current="page"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;01&lt;/span&gt;
&lt;span class="series-title"&gt;Ideia e arquitetura&lt;/span&gt;
&lt;span class="series-current"&gt;Você está aqui&lt;/span&gt;
&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="series-chapter" href="https://figueirego.com/pt/blog/posts/construindo-o-blog-02-leitura/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;02&lt;/span&gt;
&lt;span class="series-title"&gt;Design e leitura&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/pt/blog/posts/construindo-o-blog-03-publicacao/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;03&lt;/span&gt;
&lt;span class="series-title"&gt;Publicação&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/pt/blog/posts/construindo-o-blog-04-imagens/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;04&lt;/span&gt;
&lt;span class="series-title"&gt;Imagens e automação&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/pt/blog/posts/construindo-o-blog-05-seo-rss/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;05&lt;/span&gt;
&lt;span class="series-title"&gt;SEO e RSS&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;/ol&gt;
&lt;/nav&gt;</description></item></channel></rss>