<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>figueirego. – figueirego</title><link>https://figueirego.com/pt/blog/</link><description>Recent content in figueirego on figueirego.</description><generator>Hugo -- gohugo.io</generator><language>pt-BR</language><lastBuildDate>Tue, 13 Oct 2026 12:03:00 -0300</lastBuildDate><atom:link href="https://figueirego.com/pt/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Construindo meu blog, parte 1: escrever sem manter um backend</title><link>https://figueirego.com/pt/blog/posts/construindo-o-blog-01-arquitetura/</link><pubDate>Tue, 13 Oct 2026 12:03:00 -0300</pubDate><guid>https://figueirego.com/pt/blog/posts/construindo-o-blog-01-arquitetura/</guid><description>
&lt;p&gt;Este blog começa com arquivos de texto. O Hugo lê esses arquivos, aplica os layouts e gera as páginas que chegam ao navegador. Eu não preciso manter uma API de publicação nem um banco de dados próprio para servir os artigos.&lt;/p&gt;
&lt;p&gt;Essa era a condição principal quando comecei: queria um lugar para explicar o que construo, registrar decisões e voltar a elas depois. Também queria que o espaço tivesse a identidade do figueirego, fosse confortável no celular e permitisse ler em português ou inglês.&lt;/p&gt;
&lt;p&gt;Entre a primeira referência e a versão publicada, houve decisões sobre design, navegação, comentários, busca, hospedagem e imagens. Dividi o relato em três partes para explicar o conjunto sem misturar todas as responsabilidades:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Arquitetura:&lt;/strong&gt; por que escolhi essa base e o que cada componente faz.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://figueirego.com/pt/blog/posts/construindo-o-blog-02-leitura/"&gt;Experiência de leitura&lt;/a&gt;: organização, idiomas, busca, temas e comentários.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://figueirego.com/pt/blog/posts/construindo-o-blog-03-publicacao/"&gt;Publicação e operação&lt;/a&gt;: do Markdown ao domínio público, incluindo imagens e estatísticas.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-hextra-search-id="a-referência-foi-o-akita-o-resultado-precisava-ser-meu"&gt;A referência foi o Akita; o resultado precisava ser meu&lt;span class="hx:absolute hx:-mt-20" id="a-referência-foi-o-akita-o-resultado-precisava-ser-meu"&gt;&lt;/span&gt;
&lt;a href="#a-refer%c3%aancia-foi-o-akita-o-resultado-precisava-ser-meu" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;O ponto de partida foi &lt;a href="https://akitaonrails.com/2025/09/10/meu-novo-blog-como-eu-fiz/" target="_blank" rel="noopener"&gt;Meu Novo Blog — Como Eu Fiz&lt;/a&gt;, do Fabio Akita. O que me interessou foi a escolha de publicar arquivos Markdown como um site estático e reduzir o trabalho de manter uma engine própria. A prioridade era conseguir escrever.&lt;/p&gt;
&lt;p&gt;Eu gostei da proposta técnica, mas queria outra direção visual: as cores do meu site, a minha marca e uma organização pensada para os conteúdos que pretendo produzir. Separar essas duas decisões ajudou. Adotar Hugo não me obrigava a reproduzir a aparência de outro blog.&lt;/p&gt;
&lt;p&gt;Também precisei corrigir uma confusão de nomes logo no começo: &lt;strong&gt;Hugo é o gerador; Hextra é o tema&lt;/strong&gt;. O Hugo é escrito em Go. O Hextra fornece uma base de layouts e recursos sobre a qual o blog pode ser construído. O &lt;a href="https://github.com/imfing/hextra" target="_blank" rel="noopener"&gt;repositório do Hextra&lt;/a&gt; documenta essa relação.&lt;/p&gt;
&lt;h2 data-hextra-search-id="o-que-acontece-quando-alguém-abre-um-artigo"&gt;O que acontece quando alguém abre um artigo&lt;span class="hx:absolute hx:-mt-20" id="o-que-acontece-quando-alguém-abre-um-artigo"&gt;&lt;/span&gt;
&lt;a href="#o-que-acontece-quando-algu%c3%a9m-abre-um-artigo" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A página já está gerada quando o leitor chega. A hospedagem entrega HTML, CSS, JavaScript e os arquivos necessários. Não há uma consulta ao meu banco de dados para montar o texto a cada acesso.&lt;/p&gt;
&lt;p&gt;O caminho principal é este:&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;Texto em Markdown + metadados + layouts
&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; Hugo
&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; páginas estáticas
&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; navegador do leitor&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 não transforma o blog em uma página sem comportamento. A busca roda no navegador, os filtros respondem a cliques, o tema muda e os comentários vêm de um serviço externo. A distinção útil está no que preciso operar: o conteúdo principal não depende de um servidor de aplicação meu em execução.&lt;/p&gt;
&lt;p&gt;Escolhi essa estrutura porque ela atende ao tipo de publicação que quero fazer. Não estou construindo uma plataforma com contas próprias de leitores, cobrança de assinaturas ou edição simultânea no navegador. Se essas necessidades aparecerem, merecerão uma decisão específica.&lt;/p&gt;
&lt;h2 data-hextra-search-id="uma-função-clara-para-cada-ferramenta"&gt;Uma função clara para cada ferramenta&lt;span class="hx:absolute hx:-mt-20" id="uma-função-clara-para-cada-ferramenta"&gt;&lt;/span&gt;
&lt;a href="#uma-fun%c3%a7%c3%a3o-clara-para-cada-ferramenta" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A implementação ficou dividida assim:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Componente&lt;/th&gt;
&lt;th&gt;Responsabilidade neste blog&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;Guardar os textos e seus metadados.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hugo + Hextra&lt;/td&gt;
&lt;td&gt;Gerar as páginas e fornecer a base visual e funcional.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Layouts, CSS e JavaScript próprios&lt;/td&gt;
&lt;td&gt;Aplicar a identidade e os comportamentos específicos do figueirego.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub privado&lt;/td&gt;
&lt;td&gt;Versionar o código-fonte e executar as verificações e o build.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hostinger&lt;/td&gt;
&lt;td&gt;Servir o site estático no domínio público.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon S3&lt;/td&gt;
&lt;td&gt;Guardar imagens enviadas separadamente do site.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disqus&lt;/td&gt;
&lt;td&gt;Hospedar a conversa e a moderação dos comentários.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GoatCounter&lt;/td&gt;
&lt;td&gt;Registrar visitas usadas na geração dos mais lidos.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Uma decisão importante foi aproveitar a hospedagem que eu já tinha. Cheguei a considerar outros destinos, mas o blog foi publicado na Hostinger. &lt;strong&gt;A AWS entrou para as imagens, não como hospedagem das páginas.&lt;/strong&gt; Não há uma distribuição CloudFront fazendo parte deste fluxo.&lt;/p&gt;
&lt;p&gt;Os arquivos-fonte permanecem em um repositório privado. O leitor recebe o resultado publicado; não precisa de acesso ao repositório. Isso também não torna secretos os arquivos que envio ao site: textos, imagens, HTML e JavaScript servidos ao navegador são públicos.&lt;/p&gt;
&lt;h2 data-hextra-search-id="o-tema-é-uma-base-que-posso-personalizar"&gt;O tema é uma base que posso personalizar&lt;span class="hx:absolute hx:-mt-20" id="o-tema-é-uma-base-que-posso-personalizar"&gt;&lt;/span&gt;
&lt;a href="#o-tema-%c3%a9-uma-base-que-posso-personalizar" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Nesta primeira versão, fixei Hugo Extended 0.167.0 e Hextra 0.13.0. O tema está incluído no repositório. Para gerar este projeto com o binário instalado do Hugo, não preciso instalar Go ou executar um build npm local.&lt;/p&gt;
&lt;p&gt;As personalizações ficam separadas da pasta do tema:&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;content/ textos em português e inglês
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;layouts/ páginas e componentes personalizados
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;assets/ estilos, busca e interações
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;static/ fontes, marca e imagens locais
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;i18n/ mensagens da interface
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;themes/hextra/ base do tema
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scripts/ upload e verificações auxiliares&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;Essa separação deixa mais claro onde procurar um problema. Um texto incorreto vai para &lt;code&gt;content/&lt;/code&gt;. Uma mensagem do botão em inglês vai para &lt;code&gt;i18n/&lt;/code&gt;. Um espaçamento ou contraste vai para os estilos. Uma mudança no serviço de comentários fica na integração correspondente.&lt;/p&gt;
&lt;p&gt;Atualizar o tema no futuro ainda exigirá revisão. Separar os arquivos torna o trabalho mais compreensível; não garante compatibilidade automática com qualquer versão nova.&lt;/p&gt;
&lt;h2 data-hextra-search-id="onde-eu-escrevo-afinal"&gt;Onde eu escrevo, afinal?&lt;span class="hx:absolute hx:-mt-20" id="onde-eu-escrevo-afinal"&gt;&lt;/span&gt;
&lt;a href="#onde-eu-escrevo-afinal" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Essa foi uma das dúvidas durante a construção. Não existe uma aba administrativa dentro do blog em que eu entro e começo a digitar. A edição acontece no computador, em arquivos Markdown, usando um editor de texto ou de código.&lt;/p&gt;
&lt;p&gt;Cada publicação tem um cabeçalho com título, data, resumo, temas e estado de rascunho. Depois vem o texto. O conteúdo continua editável sem abrir um serviço de edição específico, e o Git registra as alterações que eu decido salvar em commits.&lt;/p&gt;
&lt;p&gt;Para revisar, uso a prévia local do Hugo. Ela mostra a página com o layout real e permite incluir rascunhos. Publicar é outra etapa: enviar o conteúdo revisado, gerar a versão de produção e conferir o domínio público. Os comandos completos estão na &lt;a href="https://figueirego.com/pt/blog/posts/construindo-o-blog-03-publicacao/"&gt;terceira parte&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;O &lt;a href="https://akitaonrails.com/2025/08/29/como-contribuir-no-blog-do-akitaonrails-usando-docker/" target="_blank" rel="noopener"&gt;texto do Akita sobre Docker&lt;/a&gt; também entrou nessa investigação. Ali, Docker prepara um ambiente local para contribuir com o repositório. Rodar essa cópia não publica automaticamente no site dele; uma contribuição segue por pull request. No meu fluxo atual, uso o Hugo localmente, sem adicionar Docker como requisito.&lt;/p&gt;
&lt;h2 data-hextra-search-id="idiomas-entraram-na-estrutura-desde-o-começo"&gt;Idiomas entraram na estrutura desde o começo&lt;span class="hx:absolute hx:-mt-20" id="idiomas-entraram-na-estrutura-desde-o-começo"&gt;&lt;/span&gt;
&lt;a href="#idiomas-entraram-na-estrutura-desde-o-come%c3%a7o" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Eu queria inglês na raiz do domínio e português em &lt;code&gt;/pt/&lt;/code&gt;. Isso virou organização de conteúdo: cada idioma tem seus arquivos, ligados por uma chave de tradução estável.&lt;/p&gt;
&lt;p&gt;O &lt;a href="https://akitaonrails.com/2026/04/09/20-anos-de-blog-o-ano-em-que-a-ia-finalmente-me-deixou-traduzir-tudo/" target="_blank" rel="noopener"&gt;relato do Akita sobre traduzir seu acervo&lt;/a&gt; foi outra referência. No meu caso, estou começando com pares de textos, em vez de migrar um arquivo histórico. O botão de idioma navega entre versões já preparadas; não chama um tradutor a cada clique.&lt;/p&gt;
&lt;p&gt;Isso coloca a revisão no processo editorial. Título, explicações e exemplos precisam continuar fazendo sentido nos dois idiomas. A infraestrutura conecta os arquivos, mas não decide se a tradução está boa.&lt;/p&gt;
&lt;h2 data-hextra-search-id="construir-com-ia-também-exigiu-conferir-o-resultado"&gt;Construir com IA também exigiu conferir o resultado&lt;span class="hx:absolute hx:-mt-20" id="construir-com-ia-também-exigiu-conferir-o-resultado"&gt;&lt;/span&gt;
&lt;a href="#construir-com-ia-tamb%c3%a9m-exigiu-conferir-o-resultado" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Usei o Codex como apoio para transformar as decisões em código, revisar comportamentos e organizar esta série. Para mostrar o resultado, esta série usa capturas reais das telas, identificadas por contexto nas legendas. O processo teve prévias, capturas de tela, pedidos de ajuste e verificações do site servido.&lt;/p&gt;
&lt;p&gt;Algumas correções nasceram do uso direto: o botão de busca que não abria como esperado, os comentários que apareciam separados por idioma e o espaço excessivo no rodapé. Nenhuma delas seria resolvida apenas por escolher uma tecnologia adequada.&lt;/p&gt;
&lt;p&gt;A construção chegou a incluir propostas de newsletter e novas divisões no menu. A newsletter saiu por enquanto; os formatos ficaram dentro do Arquivo. Ter uma possibilidade na implementação não significava que ela precisava entrar na primeira versão.&lt;/p&gt;
&lt;p&gt;O próximo passo já é usar essa estrutura para escrever. Para entender como ela se apresenta a quem chega ao blog, siga para a &lt;a href="https://figueirego.com/pt/blog/posts/construindo-o-blog-02-leitura/"&gt;parte 2: experiência de leitura&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Série Construindo meu blog:&lt;/strong&gt; &lt;strong&gt;1. Arquitetura&lt;/strong&gt; · &lt;a href="https://figueirego.com/pt/blog/posts/construindo-o-blog-02-leitura/"&gt;2. Experiência de leitura&lt;/a&gt; · &lt;a href="https://figueirego.com/pt/blog/posts/construindo-o-blog-03-publicacao/"&gt;3. Publicação e operação&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Construindo meu blog, parte 2: a experiência de quem lê</title><link>https://figueirego.com/pt/blog/posts/construindo-o-blog-02-leitura/</link><pubDate>Tue, 13 Oct 2026 12:02:00 -0300</pubDate><guid>https://figueirego.com/pt/blog/posts/construindo-o-blog-02-leitura/</guid><description>
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota editorial:&lt;/strong&gt; Esta série registra a construção inicial do blog em Hugo, separado do portfólio. A versão unificada do site reúne os dois em figueirego.com, com o blog em &lt;code&gt;/blog/&lt;/code&gt; (inglês) e &lt;code&gt;/pt/blog/&lt;/code&gt; (português). A navegação e as capturas abaixo documentam aquela etapa inicial.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Um leitor chega para encontrar um texto. Talvez lembre do assunto, talvez queira ver o que publiquei por último, talvez tenha recebido um link. A organização do blog precisa atender esses caminhos sem exigir que ele entenda como eu organizo meus arquivos.&lt;/p&gt;
&lt;p&gt;Essa foi a parte mais iterativa da construção. Eu queria a simplicidade da base apresentada pelo Akita, com a identidade do meu site e uma experiência própria. Cores e fontes foram o começo; as decisões mais importantes apareceram na navegação, na busca e nos comentários.&lt;/p&gt;
&lt;p&gt;Na &lt;a href="https://figueirego.com/pt/blog/posts/construindo-o-blog-01-arquitetura/"&gt;primeira parte&lt;/a&gt;, explico a arquitetura. Aqui, o foco é o que acontece depois que a página abre.&lt;/p&gt;
&lt;h2 data-hextra-search-id="a-identidade-precisava-continuar-sendo-figueirego"&gt;A identidade precisava continuar sendo figueirego&lt;span class="hx:absolute hx:-mt-20" id="a-identidade-precisava-continuar-sendo-figueirego"&gt;&lt;/span&gt;
&lt;a href="#a-identidade-precisava-continuar-sendo-figueirego" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Usei os SVGs da marca já presentes no meu site, com versões para fundos claros e escuros. Isso preserva o desenho da logo. Para títulos, interface e texto, mantive Manrope; para código, JetBrains Mono. Os arquivos das fontes são servidos pelo próprio blog.&lt;/p&gt;
&lt;p&gt;O verde-petróleo marca links e ações no tema claro. No escuro, o destaque fica mais claro, próximo do turquesa, para continuar visível sobre o fundo. O conteúdo usa superfícies discretas, divisores e espaço entre blocos.&lt;/p&gt;
&lt;p&gt;O cabeçalho recebeu o efeito de vidro que eu também queria no site: fundo translúcido, desfoque e uma borda leve. Há uma alternativa sólida para navegadores sem suporte e para quem prefere reduzir transparências. O efeito acompanha a leitura; não deve dificultá-la.&lt;/p&gt;
&lt;h2 data-hextra-search-id="quatro-caminhos-na-barra-superior"&gt;Quatro caminhos na barra superior&lt;span class="hx:absolute hx:-mt-20" id="quatro-caminhos-na-barra-superior"&gt;&lt;/span&gt;
&lt;a href="#quatro-caminhos-na-barra-superior" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A organização passou por versões com Artigos, Notas e Experimentos no topo. Conforme surgiram Respostas e Transcrições, ficou claro que colocar cada formato na barra aumentaria a disputa por espaço, especialmente no celular.&lt;/p&gt;
&lt;p&gt;Na versão independente descrita aqui, a navegação final ficou assim:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Recentes:&lt;/strong&gt; todas as publicações, da mais nova para a mais antiga.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Arquivo:&lt;/strong&gt; o conjunto completo, com filtros para encontrar um texto específico.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sobre:&lt;/strong&gt; minha apresentação e os links para me encontrar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Meu site:&lt;/strong&gt; acesso ao figueirego.com, na versão correspondente ao idioma atual.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Os links externos abrem em outra aba. Dentro do blog, a navegação continua na mesma. No celular, o cabeçalho reorganiza os controles e a navegação em linhas, preservando áreas de toque e rótulos acessíveis.&lt;/p&gt;
&lt;h2 data-hextra-search-id="formato-e-tema-respondem-perguntas-diferentes"&gt;Formato e tema respondem perguntas diferentes&lt;span class="hx:absolute hx:-mt-20" id="formato-e-tema-respondem-perguntas-diferentes"&gt;&lt;/span&gt;
&lt;a href="#formato-e-tema-respondem-perguntas-diferentes" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Um artigo sobre Go pode compartilhar assunto com um experimento e com uma resposta a alguém. Por isso, mantive os formatos separados dos temas:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Formato&lt;/th&gt;
&lt;th&gt;Quando pretendo usar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Artigos&lt;/td&gt;
&lt;td&gt;Desenvolver uma ideia, uma decisão ou um processo com contexto.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notas&lt;/td&gt;
&lt;td&gt;Registrar uma observação ou um aprendizado mais curto.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Experimentos&lt;/td&gt;
&lt;td&gt;Documentar uma tentativa, sua configuração e o que foi observado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Respostas&lt;/td&gt;
&lt;td&gt;Desenvolver uma pergunta recebida nas redes ou nos comentários.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transcrições&lt;/td&gt;
&lt;td&gt;Publicar versões em texto dos meus vídeos e conversas.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Os temas são as tags: engenharia de software, aprendizado, Go e outros assuntos que aparecerem nas publicações. Um texto pode ter mais de um tema sem precisar existir em várias cópias.&lt;/p&gt;
&lt;p&gt;No Arquivo, o leitor combina formato, ano, tema e busca textual. Os filtros ficam no endereço, permitindo compartilhar aquela seleção e usar voltar ou avançar. Sem JavaScript, a lista completa continua disponível. As contagens dos temas vêm do conteúdo publicado; não preenchi a interface com números de demonstração.&lt;/p&gt;
&lt;h2 data-hextra-search-id="imagens-ajudam-quando-têm-uma-função"&gt;Imagens ajudam quando têm uma função&lt;span class="hx:absolute hx:-mt-20" id="imagens-ajudam-quando-têm-uma-função"&gt;&lt;/span&gt;
&lt;a href="#imagens-ajudam-quando-t%c3%aam-uma-fun%c3%a7%c3%a3o" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Gostei da ideia de mostrar capas nas publicações. Elas ajudam a identificar um texto e podem antecipar um conceito, como um fluxo ou uma arquitetura. Decidi mantê-las opcionais: uma nota curta pode funcionar perfeitamente só com título e texto.&lt;/p&gt;
&lt;p&gt;A publicação mais recente recebe mais espaço na home. As demais seguem com título, resumo e metadados, acompanhados de miniatura quando existe capa. Na página do artigo, a imagem aparece inteira, com texto alternativo e legenda quando informados.&lt;/p&gt;
&lt;p&gt;Também registro suas dimensões para reservar espaço antes do carregamento. Para explicar esta construção, escolhi capturas reais do processo. A capa desta parte mostra o Arquivo na prévia local, já com os artigos desta série. A legenda identifica o ambiente: uma tela local ajuda a mostrar a interface, mas não comprova que aquela versão já foi publicada.&lt;/p&gt;
&lt;h2 data-hextra-search-id="buscar-precisa-encontrar-o-que-está-no-texto"&gt;Buscar precisa encontrar o que está no texto&lt;span class="hx:absolute hx:-mt-20" id="buscar-precisa-encontrar-o-que-está-no-texto"&gt;&lt;/span&gt;
&lt;a href="#buscar-precisa-encontrar-o-que-est%c3%a1-no-texto" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Durante as revisões, a busca virou um ponto de atenção: o botão precisava ter presença suficiente, abrir corretamente e permitir encontrar conteúdo além do título. Um controle bonito que trava interrompe o caminho do leitor.&lt;/p&gt;
&lt;p&gt;A implementação usa FlexSearch no navegador, com um índice do idioma atual. Ela considera título, descrição, resumo, tags e texto completo. A normalização de acentos permite procurar &lt;code&gt;publicacao&lt;/code&gt; e encontrar conteúdo com “publicação”. O botão e os atalhos &lt;code&gt;Ctrl+K&lt;/code&gt; ou &lt;code&gt;⌘K&lt;/code&gt; abrem o diálogo.&lt;/p&gt;
&lt;p&gt;Há duas buscas com objetivos diferentes. O campo do &lt;strong&gt;Arquivo&lt;/strong&gt; filtra sua lista por título, resumo e temas. A busca do &lt;strong&gt;cabeçalho&lt;/strong&gt; procura também dentro dos textos. Se alguém lembra de um trecho sobre &lt;code&gt;translationKey&lt;/code&gt;, pode usar a segunda para encontrar este artigo.&lt;/p&gt;
&lt;p&gt;A busca local acompanha o conteúdo gerado pelo Hugo. Isso exige JavaScript no navegador, mas dispensa um servidor de busca próprio.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://figueirego.com/pt/blog/images/blog-search-process.webp" alt="Busca do blog na prévia local por translationKey, com os resultados da pesquisa." loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Busca na prévia local por &lt;code&gt;translationKey&lt;/code&gt;, antes da publicação da série.&lt;/em&gt;&lt;/p&gt;
&lt;h2 data-hextra-search-id="dois-idiomas-uma-publicação-relacionada"&gt;Dois idiomas, uma publicação relacionada&lt;span class="hx:absolute hx:-mt-20" id="dois-idiomas-uma-publicação-relacionada"&gt;&lt;/span&gt;
&lt;a href="#dois-idiomas-uma-publica%c3%a7%c3%a3o-relacionada" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Naquela versão, o inglês ocupava a raiz de &lt;code&gt;blog.figueirego.com&lt;/code&gt;; o português ficava em &lt;code&gt;/pt/&lt;/code&gt; no mesmo subdomínio. Cada versão tem seu próprio Markdown. O seletor leva à tradução correspondente quando ela existe; ele não traduz o texto ao ser acionado.&lt;/p&gt;
&lt;p&gt;A ligação entre as versões deste artigo é explícita:&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="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;Os dois arquivos usam essa mesma chave, embora tenham títulos e endereços diferentes. Isso permite revisar a tradução como texto de verdade. Também significa que uma correção editorial precisa ser considerada nos dois idiomas.&lt;/p&gt;
&lt;p&gt;O idioma não determina a aparência. Por padrão, o tema acompanha o sistema; um clique alterna entre claro e escuro e salva a preferência naquele navegador. As transições dos ícones respeitam a preferência por movimento reduzido.&lt;/p&gt;
&lt;h2 data-hextra-search-id="uma-conversa-para-as-duas-versões"&gt;Uma conversa para as duas versões&lt;span class="hx:absolute hx:-mt-20" id="uma-conversa-para-as-duas-versões"&gt;&lt;/span&gt;
&lt;a href="#uma-conversa-para-as-duas-vers%c3%b5es" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;No teste inicial, trocar de idioma podia levar a uma conversa diferente. Para o mesmo artigo, eu preferi reunir os comentários: quem lê em inglês e quem lê em português participa da mesma discussão.&lt;/p&gt;
&lt;p&gt;O Disqus usa uma identidade compartilhada entre as traduções, baseada na &lt;code&gt;translationKey&lt;/code&gt;. Sua interface acompanha o idioma da página. O texto que cada pessoa escreveu permanece no idioma original.&lt;/p&gt;
&lt;p&gt;Os comentários carregam automaticamente nas publicações elegíveis em produção. Se o carregamento falhar, há uma opção para tentar novamente. A prévia local não abre as discussões reais.&lt;/p&gt;
&lt;p&gt;O tema exigiu um cuidado adicional. O editor do Disqus está dentro de um iframe de outro domínio. Depois que o leitor interage com ele, o blog preserva o componente ao trocar de tema, pois pode existir um comentário ainda não enviado. Nesse caso, oferece uma atualização manual. Vale enviar ou copiar o texto antes de usá-la.&lt;/p&gt;
&lt;p&gt;É uma integração externa, com suas próprias opções de moderação, aparência e anúncios no plano escolhido. Ter um blog estático não elimina essas dependências; apenas evita que eu mantenha um backend de comentários.&lt;/p&gt;
&lt;h2 data-hextra-search-id="acompanhar-sem-acrescentar-outra-tarefa"&gt;Acompanhar sem acrescentar outra tarefa&lt;span class="hx:absolute hx:-mt-20" id="acompanhar-sem-acrescentar-outra-tarefa"&gt;&lt;/span&gt;
&lt;a href="#acompanhar-sem-acrescentar-outra-tarefa" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Mantive o RSS no rodapé, com uma página que explica o recurso e permite copiar o endereço do feed. Os cinco formatos publicados entram no RSS do respectivo idioma. Quem usa um leitor de feeds pode acompanhar as novidades por ali.&lt;/p&gt;
&lt;p&gt;A newsletter ficou de fora por enquanto. Já os Mais lidos dependem de dados reais e serão explicados na &lt;a href="https://figueirego.com/pt/blog/posts/construindo-o-blog-03-publicacao/"&gt;terceira parte, sobre publicação e operação&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Para experimentar a organização, abra o Arquivo e selecione o tema &lt;strong&gt;engenharia de software&lt;/strong&gt;. Depois, procure &lt;code&gt;translationKey&lt;/code&gt; no botão de busca e troque o idioma deste artigo. Esses caminhos são um teste mais útil da interface do que olhar apenas para uma captura da home.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Série Construindo meu blog:&lt;/strong&gt; &lt;a href="https://figueirego.com/pt/blog/posts/construindo-o-blog-01-arquitetura/"&gt;1. Arquitetura&lt;/a&gt; · &lt;strong&gt;2. Experiência de leitura&lt;/strong&gt; · &lt;a href="https://figueirego.com/pt/blog/posts/construindo-o-blog-03-publicacao/"&gt;3. Publicação e operação&lt;/a&gt;.&lt;/p&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>Tue, 13 Oct 2026 12:01:00 -0300</pubDate><guid>https://figueirego.com/pt/blog/posts/construindo-o-blog-03-publicacao/</guid><description>
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota editorial:&lt;/strong&gt; Esta série registra a construção inicial do blog em Hugo, separado do portfólio. A versão unificada do site reúne os dois em figueirego.com, com o blog em &lt;code&gt;/blog/&lt;/code&gt; (inglês) e &lt;code&gt;/pt/blog/&lt;/code&gt; (português). Os comandos, as capturas e o fluxo &lt;code&gt;main&lt;/code&gt; → &lt;code&gt;published&lt;/code&gt; → &lt;code&gt;blog.figueirego.com&lt;/code&gt; abaixo pertencem à versão independente; não descrevem a publicação do site unificado.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;O arquivo que contém este texto está em &lt;code&gt;content/pt/posts/&lt;/code&gt;. A versão em inglês fica em &lt;code&gt;content/en/posts/&lt;/code&gt;. Para publicar, eu reviso os dois, gero o site, verifico o resultado e envio a alteração ao GitHub. A hospedagem recebe páginas prontas.&lt;/p&gt;
&lt;p&gt;Era essa a experiência que eu procurava: conseguir escrever sem precisar cuidar de uma aplicação de publicação funcionando o tempo inteiro. Ainda há ferramentas e serviços envolvidos. A diferença está em saber qual trabalho cada um faz e em manter um caminho curto entre o texto e o leitor.&lt;/p&gt;
&lt;p&gt;Esta é a terceira parte da construção do blog. Na &lt;a href="https://figueirego.com/pt/blog/posts/construindo-o-blog-01-arquitetura/"&gt;primeira, expliquei a arquitetura&lt;/a&gt;; na &lt;a href="https://figueirego.com/pt/blog/posts/construindo-o-blog-02-leitura/"&gt;segunda, as decisões de leitura e navegação&lt;/a&gt;. Aqui vou percorrer a publicação de ponta a ponta.&lt;/p&gt;
&lt;h2 data-hextra-search-id="o-editor-é-um-arquivo-no-computador"&gt;O editor é um arquivo no computador&lt;span class="hx:absolute hx:-mt-20" id="o-editor-é-um-arquivo-no-computador"&gt;&lt;/span&gt;
&lt;a href="#o-editor-%c3%a9-um-arquivo-no-computador" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Escrevo em Markdown, no editor de código. Para começar um artigo, uso o modelo que já está no repositório:&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;hugo new content content/pt/posts/meu-artigo.md --kind default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo new content content/en/posts/my-article.md --kind default&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;Os arquivos nascem como rascunhos. O cabeçalho do texto, chamado &lt;em&gt;front matter&lt;/em&gt;, reúne os dados que o layout precisa. Um exemplo reduzido, seguindo as convenções deste 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-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 publiquei 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-13T09: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;sample&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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="s2"&gt;&amp;#34;how-i-published-my-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;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;Da escrita em Markdown à 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;summary&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 e o fluxo para colocar o blog no ar.&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;engenharia de software&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;Hugo&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="nt"&gt;image&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;/images/minha-capa.webp&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;imageAlt&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;Tela do Arquivo do blog, com publicações organizadas por ano.&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;imageCaption&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;Captura da prévia local do Arquivo.&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;imageWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1512&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;imageHeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;805&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;Na tradução, título, resumo e texto mudam. A &lt;code&gt;translationKey&lt;/code&gt; permanece igual, mesmo que os nomes dos arquivos sejam diferentes. É assim que relaciono as duas versões. O seletor de idioma encontra a tradução existente; ele não traduz o artigo sozinho. Esse uso da chave segue o &lt;a href="https://gohugo.io/content-management/front-matter/" target="_blank" rel="noopener"&gt;front matter do Hugo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As dimensões precisam corresponder à imagem real. A capa é opcional: uma nota curta pode funcionar melhor só com texto. Para inserir uma imagem no meio de um artigo, uso a sintaxe habitual:&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-md" data-lang="md"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;![&lt;span class="nt"&gt;Descrição do que o diagrama explica&lt;/span&gt;](&lt;span class="na"&gt;/images/meu-diagrama.webp&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;h2 data-hextra-search-id="salvar-visualizar-e-publicar-são-etapas-diferentes"&gt;Salvar, visualizar e publicar são etapas diferentes&lt;span class="hx:absolute hx:-mt-20" id="salvar-visualizar-e-publicar-são-etapas-diferentes"&gt;&lt;/span&gt;
&lt;a href="#salvar-visualizar-e-publicar-s%c3%a3o-etapas-diferentes" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Durante a escrita, inicio a prévia:&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;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;O endereço local permite revisar o texto, as imagens e os dois idiomas. &lt;code&gt;--buildDrafts&lt;/code&gt; inclui os rascunhos nessa visualização. Salvar o arquivo atualiza a prévia; nada disso coloca o artigo na internet.&lt;/p&gt;
&lt;p&gt;Na versão independente, antes de publicar, eu alterava &lt;code&gt;draft&lt;/code&gt; para &lt;code&gt;false&lt;/code&gt; e verificava o resultado com esta configuração de produçã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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 -m unittest discover -s tests -v
&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;hugo --config hugo.yaml,hugo.production.yaml &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --environment production --minify --panicOnWarning &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cleanDestinationDir &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --baseURL https://blog.figueirego.com/
&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;python3 scripts/check-site.py public &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --production-url https://blog.figueirego.com/&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;Os testes cobrem comportamentos do projeto; o verificador inspeciona o HTML gerado, links locais, traduções, feeds e metadados de publicação. A configuração de produção também retira as restrições de indexação usadas na prévia. Gerar apenas a versão local e copiar seus arquivos poderia levar essas restrições para o site público.&lt;/p&gt;
&lt;p&gt;Testes não substituem leitura. Também preciso conferir se a capa combina com o texto, se a tradução está natural e se os exemplos fazem sentido.&lt;/p&gt;
&lt;h2 data-hextra-search-id="github-entrega-hostinger-serve-as-páginas"&gt;GitHub entrega; Hostinger serve as páginas&lt;span class="hx:absolute hx:-mt-20" id="github-entrega-hostinger-serve-as-páginas"&gt;&lt;/span&gt;
&lt;a href="#github-entrega-hostinger-serve-as-p%c3%a1ginas" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Naquela versão, depois da revisão, eu enviava para a &lt;code&gt;main&lt;/code&gt; os arquivos de conteúdo e as imagens locais necessárias. O workflow repetia os testes, fazia o build do Hugo e preparava a branch &lt;code&gt;published&lt;/code&gt; com o resultado.&lt;/p&gt;
&lt;p&gt;O percurso de publicação do blog independente 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;Markdown e imagens locais
&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;GitHub: 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 + Hugo + verificação dos arquivos
&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;GitHub: published
&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 → blog.figueirego.com&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 código-fonte fica separado do pacote servido. Não edito &lt;code&gt;published&lt;/code&gt; manualmente, porque seu conteúdo é gerado pelo workflow.&lt;/p&gt;
&lt;p&gt;Existe um &lt;code&gt;package.json&lt;/code&gt; mínimo nessa branch para compatibilidade com o preset da Hostinger. Ele não tem dependências e seu comando de build apenas verifica a existência de &lt;code&gt;public/index.html&lt;/code&gt;. O Hugo já executou no GitHub; a hospedagem recebe HTML, CSS, JavaScript e assets prontos. Não preciso manter um servidor de aplicação ou banco de dados próprio para entregar os artigos.&lt;/p&gt;
&lt;p&gt;Uma publicação só está confirmada depois de conferir três coisas: os checks no GitHub, o deployment correspondente na Hostinger e a página no domínio público. Um workflow verde comprova aquela execução; não comprova, sozinho, qual versão o leitor recebeu.&lt;/p&gt;
&lt;h2 data-hextra-search-id="as-imagens-podem-seguir-junto-ou-ficar-no-s3"&gt;As imagens podem seguir junto ou ficar no S3&lt;span class="hx:absolute hx:-mt-20" id="as-imagens-podem-seguir-junto-ou-ficar-no-s3"&gt;&lt;/span&gt;
&lt;a href="#as-imagens-podem-seguir-junto-ou-ficar-no-s3" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A AWS entrou como armazenamento de imagens. As páginas continuam na Hostinger. Um arquivo em &lt;code&gt;static/images/&lt;/code&gt; acompanha o build; uma imagem no S3 é enviada separadamente e referenciada por sua URL pública.&lt;/p&gt;
&lt;p&gt;Não preciso migrar toda imagem para a AWS para usar o blog. Posso publicar uma capa local junto do artigo e usar o S3 quando quiser manter um arquivo fora do pacote do site. O build não faz uploads automaticamente.&lt;/p&gt;
&lt;p&gt;Para o envio, configurei um usuário IAM dedicado, com permissões limitadas ao prefixo de imagens do bucket. Ele usa MFA por passkey e login temporário da AWS CLI, sem uma chave de acesso permanente dentro do projeto. A AWS documenta esse &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sign-in.html" target="_blank" rel="noopener"&gt;fluxo de autenticação pelo navegador&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;O script de upload permite conferir o destino antes de enviar. Os nomes abaixo são exemplos; devem ser substituídos pelos valores de um ambiente já configurado:&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;aws login --profile meu-blog --region us-east-1
&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;python3 scripts/upload-image.py /caminho/capa.webp &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --bucket meu-bucket-de-imagens &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --base-url https://meu-bucket-de-imagens.s3.us-east-1.amazonaws.com &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --profile meu-blog &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --prefix images &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --dry-run&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;--dry-run&lt;/code&gt; valida o arquivo e mostra um destino possível, mas não envia nada nem confirma acesso público. Para enviar, repito o comando do script sem essa opção. Cada execução gera uma chave nova; a URL da simulação não será a URL final.&lt;/p&gt;
&lt;p&gt;Depois do envio, abro a URL retornada sem sessão AWS e verifico a imagem. O script não torna um bucket privado público: a permissão de leitura já precisa estar configurada. No meu fluxo, as imagens publicadas usam HTTPS sem assinatura temporária, para que o endereço não expire junto de uma sessão.&lt;/p&gt;
&lt;p&gt;O upload define cache longo com &lt;code&gt;immutable&lt;/code&gt; e nomes únicos. Se eu corrigir uma imagem, envio outro arquivo e atualizo a URL no texto. A versão anterior permanece no bucket até ser removida. Também há um alerta de custos: ele avisa sobre o gasto, mas não impõe um teto nem desliga recursos. Blog simples não é promessa de conta zerada.&lt;/p&gt;
&lt;h2 data-hextra-search-id="mais-lidos-sem-consultar-estatísticas-a-cada-leitura"&gt;“Mais lidos” sem consultar estatísticas a cada leitura&lt;span class="hx:absolute hx:-mt-20" id="mais-lidos-sem-consultar-estatísticas-a-cada-leitura"&gt;&lt;/span&gt;
&lt;a href="#mais-lidos-sem-consultar-estat%c3%adsticas-a-cada-leitura" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;O GoatCounter registra as visitas, e o GitHub consulta essas estatísticas durante a publicação e em uma execução diária agendada. O resultado vira uma lista estática incorporada à página inicial.&lt;/p&gt;
&lt;p&gt;O token tem permissão de leitura das estatísticas e fica em um secret do GitHub, disponível à etapa responsável por essa consulta. Ele não vai para o JavaScript do leitor. No navegador, há o script público de contagem; a montagem do ranking acontece antes de servir a página. A autenticação da integração segue a &lt;a href="https://www.goatcounter.com/help/api" target="_blank" rel="noopener"&gt;API do GoatCounter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Os filtros têm significados precisos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Semana:&lt;/strong&gt; os sete dias completos anteriores à atualização, em UTC.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mês:&lt;/strong&gt; os trinta dias completos anteriores à atualização, em UTC.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;São janelas móveis, não a semana e o mês do calendário. O dia atual fica de fora por estar incompleto. A lista é atualizada diariamente, sem promessa de tempo real.&lt;/p&gt;
&lt;p&gt;As visitas às versões em português e inglês são somadas pela &lt;code&gt;translationKey&lt;/code&gt;; o link e o título aparecem no idioma do leitor. O número representa visitas registradas, não uma garantia de leitura completa ou de pessoas únicas entre idiomas. Bloqueadores também podem impedir a coleta.&lt;/p&gt;
&lt;p&gt;Se uma consulta falhar, preservo o último resultado válido daquele período, com a data original. Se não houver dados válidos, não invento números: a lista fica vazia, e a seção permanece oculta quando nenhum período tem conteúdo.&lt;/p&gt;
&lt;h2 data-hextra-search-id="a-rotina-depois-de-colocar-no-ar"&gt;A rotina depois de colocar no ar&lt;span class="hx:absolute hx:-mt-20" id="a-rotina-depois-de-colocar-no-ar"&gt;&lt;/span&gt;
&lt;a href="#a-rotina-depois-de-colocar-no-ar" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Comentários ficam no Disqus e precisam de moderação. RSS acompanha as publicações elegíveis de cada idioma e oferece uma forma de seguir o blog. A newsletter ficou de fora por enquanto.&lt;/p&gt;
&lt;p&gt;Terceirizar essas funções reduz o que eu opero, mas mantém dependências: hospedagem, armazenamento, comentários e estatísticas podem falhar ou mudar suas condições. O texto e sua publicação continuam apoiados nos arquivos versionados.&lt;/p&gt;
&lt;p&gt;Para o próximo artigo, minha rotina é concreta: escrever, revisar a tradução, preparar a capa, conferir a prévia, rodar as verificações, enviar a alteração e abrir a página publicada. Depois, responder aos comentários e corrigir o que precisar. A infraestrutura tem de deixar espaço para esse trabalho.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nesta série:&lt;/strong&gt; &lt;a href="https://figueirego.com/pt/blog/posts/construindo-o-blog-01-arquitetura/"&gt;1. Arquitetura&lt;/a&gt; · &lt;a href="https://figueirego.com/pt/blog/posts/construindo-o-blog-02-leitura/"&gt;2. Leitura e navegação&lt;/a&gt; · &lt;strong&gt;3. Publicação&lt;/strong&gt;.&lt;/p&gt;</description></item></channel></rss>