<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Tiago Holanda · News</title><description>Tiago Holanda, desenvolvedor de software e games. Crio aplicações, jogos, automações com IA e apps Android e iOS. Transformando ideias em experiências vivas.</description><link>https://tiagoholanda.tech/</link><item><title>Como construí tiagoholanda.tech com Astro e Three.js</title><link>https://tiagoholanda.tech/news/como-construi-tiagoholanda-tech/</link><guid isPermaLink="true">https://tiagoholanda.tech/news/como-construi-tiagoholanda-tech/</guid><description>Bastidores de tiagoholanda.tech: por que Astro estático, como as ilhas carregam, paleta preto e gelo e o Three.js só depois do HTML crítico.</description><pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eu construí tiagoholanda.tech em Astro estático porque o HTML precisa sair pronto para o Google e para os LLMs, e a Hostinger serve arquivos. O Three.js entra como island, depois do título e dos botões. A paleta é só preto e gelo. Projetos e artigos vivem em collections. Não há formulário nem banco: o contato é WhatsApp e e-mail.&lt;/p&gt;
&lt;h2&gt;A restrição que escolheu a stack&lt;/h2&gt;
&lt;p&gt;O domínio aponta para um Cloud Enterprise da Hostinger no Brasil. Dá para rodar Node. Eu não quis um processo vivo para um site que vende conversa, não login.&lt;/p&gt;
&lt;p&gt;Astro com &lt;code&gt;output: &apos;static&apos;&lt;/code&gt; gera HTML, CSS e o JavaScript das ilhas. O deploy é &lt;code&gt;rsync&lt;/code&gt; do &lt;code&gt;dist/&lt;/code&gt; para &lt;code&gt;public_html&lt;/code&gt;. Sem PM2, sem cold start, cache de CDN trivial.&lt;/p&gt;
&lt;p&gt;Next.js faria o mesmo trabalho com mais superfície. Aqui a regra é outra: crawler, LLM e visitante leem o mesmo HTML. O React fica reservado para filtros de projeto e para a cena 3D.&lt;/p&gt;
&lt;p&gt;Os &lt;a href=&quot;/#servicos&quot;&gt;serviços&lt;/a&gt; descrevem resultado para o cliente. A stack é detalhe. O site precisa se comportar do mesmo jeito: conteúdo primeiro, movimento depois.&lt;/p&gt;
&lt;h2&gt;HTML primeiro, movimento depois&lt;/h2&gt;
&lt;p&gt;A home é one-page. Hero, serviços, stack, projetos, processo, news e contato. Cada seção tem âncora, rótulo em JetBrains Mono e um &lt;code&gt;h2&lt;/code&gt; em Chakra Petch.&lt;/p&gt;
&lt;p&gt;O JavaScript da página faz três coisas baratas:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;O H1 do hero “decodifica” uma vez por sessão.&lt;/li&gt;&lt;li&gt;As seções revelam com GSAP e ScrollTrigger quando entram 15% na viewport.&lt;/li&gt;&lt;li&gt;O menu marca a âncora ativa.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Tudo isso respeita &lt;code&gt;prefers-reduced-motion&lt;/code&gt;. Com a opção ligada, o conteúdo já aparece e o decode não roda.&lt;/p&gt;
&lt;p&gt;Os filtros de projeto são uma island React com &lt;code&gt;client:visible&lt;/code&gt;. O HTML da grade existe antes da hidratação. Abrir um card usa um &lt;code&gt;dialog&lt;/code&gt; nativo, foco preso e &lt;code&gt;Esc&lt;/code&gt; para fechar.&lt;/p&gt;
&lt;h2&gt;Preto, gelo, sem cor de marca&lt;/h2&gt;
&lt;p&gt;A identidade cabe em duas hex: &lt;code&gt;#000000&lt;/code&gt; e &lt;code&gt;#EEEEEE&lt;/code&gt;. Cinzas intermediários são opacidade do gelo, nunca uma terceira cor. Logos de stack entram em &lt;code&gt;currentColor&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Três fontes, self-hosted via Fontsource:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Chakra Petch nos títulos, caixa alta.&lt;/li&gt;&lt;li&gt;IBM Plex Sans no texto.&lt;/li&gt;&lt;li&gt;JetBrains Mono em rótulos, tags e metadados.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Raio 0, linhas de 1px. O movimento dura no máximo 600ms, com easing expo-out.&lt;/p&gt;
&lt;p&gt;Essa disciplina vale para o blog. Nos artigos, H2 e H3 perdem a caixa alta para caber em texto longo. A medida fica em 65ch, &lt;code&gt;line-height&lt;/code&gt; 1.7. Blocos de código usam as variáveis do Shiki mapeadas para gelo sobre preto. Sem tema colorido.&lt;/p&gt;
&lt;h2&gt;Projetos como dado, não como página solta&lt;/h2&gt;
&lt;p&gt;Os quatro repositórios públicos (Affiliate Tool, Agente Redator RAG, Neon Breakout e Neon Pong) vivem em &lt;code&gt;src/content/projects&lt;/code&gt;. Zod valida capa, alt, problema, solução e links.&lt;/p&gt;
&lt;p&gt;A home monta uma grade única, com filtro por natureza: Jogo, Aplicação, IA, Automação, Web. Jogos e software no mesmo ofício. O JSON-LD da home inclui um &lt;code&gt;ItemList&lt;/code&gt; com &lt;code&gt;SoftwareApplication&lt;/code&gt; ou &lt;code&gt;VideoGame&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;As capas dos jogos são as artes publicadas. Affiliate Tool e Agente Redator RAG usam ilustrações de capa, até existirem capturas reais das telas.&lt;/p&gt;
&lt;h2&gt;Three.js como island, não como fundo&lt;/h2&gt;
&lt;p&gt;A frase-núcleo pede um objeto no hero: partículas que convergem num icosaedro wireframe. Isso é o Idea Core.&lt;/p&gt;
&lt;p&gt;Regras que o canvas obedece:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;HTML do hero independe do WebGL.&lt;/li&gt;&lt;li&gt;Carregamento com &lt;code&gt;client:idle&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Sem WebGL2, GPU fraca ou &lt;code&gt;prefers-reduced-motion&lt;/code&gt;, o visitante vê o SVG estático.&lt;/li&gt;&lt;li&gt;Budget de 180 KB gzip para three + r3f, tree-shaken.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;A ordem continua a mesma: ideia no HTML, forma 3D depois, se o aparelho aguentar.&lt;/p&gt;
&lt;h2&gt;SEO e GEO no mesmo HTML&lt;/h2&gt;
&lt;p&gt;Cada página tem um &lt;code&gt;h1&lt;/code&gt;, canonical absoluto, &lt;code&gt;title&lt;/code&gt; curto e description entre 120 e 160 caracteres. O grafo JSON-LD global descreve Pessoa, WebSite e ProfessionalService. A home acrescenta a lista de projetos. Cada artigo acrescenta &lt;code&gt;BlogPosting&lt;/code&gt;, &lt;code&gt;BreadcrumbList&lt;/code&gt; e &lt;code&gt;FAQPage&lt;/code&gt; quando o frontmatter tem perguntas.&lt;/p&gt;
&lt;p&gt;O feed RSS sai em &lt;code&gt;/rss.xml&lt;/code&gt;. &lt;code&gt;/llms.txt&lt;/code&gt; descreve serviços, projetos e artigos para LLMs. &lt;code&gt;/llms-full.txt&lt;/code&gt; concatena o Markdown dos textos. &lt;code&gt;robots.txt&lt;/code&gt; libera GPTBot, ClaudeBot, PerplexityBot e os demais crawlers de IA.&lt;/p&gt;
&lt;p&gt;Este artigo abre com um parágrafo que responde o título. Os subtítulos são seções de fato. No fim, o CTA aponta para o WhatsApp, o mesmo da home.&lt;/p&gt;
&lt;p&gt;Quem quiser ver o ofício em código abre os &lt;a href=&quot;/#projetos&quot;&gt;projetos&lt;/a&gt;. Quem quiser encomendar algo, fala comigo.&lt;/p&gt;
&lt;h2&gt;O que ainda falta no lançamento&lt;/h2&gt;
&lt;p&gt;O blog, o Idea Core, os testes e o pipeline de rsync já estão no repositório. Faltam os artigos dos outros clusters (jogos como software, RAG, n8n), capturas reais dos projetos e o primeiro deploy na Hostinger, com Search Console e Bing.&lt;/p&gt;
&lt;p&gt;Nada disso muda a tese. Jogos e software são o mesmo trabalho. O site precisa se comportar como o software que eu entrego: responder, caber no aparelho e continuar claro depois do lançamento.&lt;/p&gt;</content:encoded><category>astro</category><category>three.js</category><category>seo</category><category>performance</category><category>ilhas</category><author>tiagoholandaweb@gmail.com</author></item></channel></rss>