O Que Acontece Depois da Migração: 8 Dias de Retornos Compostos
Migrei meu blog para o Next.js e achei que a parte difícil tinha acabado. Então o efeito composto começou — 6 mega guias, uma IA mais inteligente, newsletter nativa, proteção contra bots e reformulação de SEO em 8 dias.
Oito dias atrás, reconstruí todo o backend do meu blog em 4 dias. Migrei 485 posts do WordPress para o Next.js, trouxe a Sydney (minha IA de chatbot) de volta à vida e coloquei um site em produção.
Achei que essa seria a história. Migração concluída, celebrar, seguir em frente.
Estava errado. A migração não era o destino — era a linha de partida.
Veja como o meu site estava em 5 de fevereiro vs hoje:
| Funcionalidade | 5/fev (Dia da Migração) | 13/fev (Hoje) |
|---|---|---|
| Posts do blog | 485 (migrados do WordPress) | 492 (6 novos mega guias) |
| Sydney AI | RAG básico, qualidade não testada | Avaliada, otimizada, 81% de hit rate |
| Newsletter | Embed do Beehiiv (terceiros) | Supabase + Resend nativo, por interesse |
| SEO | Sitemap básico + meta tags | Dados estruturados, FAQ schema, llms.txt, AEO |
| Segurança | Apenas limitação de taxa | Cloudflare Turnstile + limitação de taxa |
| Performance | Verificações básicas no Lighthouse | Perfilamento sistemático com Chrome DevTools MCP |
| Imagens em destaque | Criação manual | Pipeline gerado por IA (Gemini + auto-otimização) |
Cada uma dessas melhorias aconteceu porque a anterior facilitou a próxima. Esse é o efeito composto que não esperava.
O Desbloqueio: Seu Blog Agora É Código
Aqui está o que ninguém te conta sobre migrar do WordPress para um stack baseado em código: a migração em si não é o ponto. O ponto é o que se torna possível depois.
Quando o seu blog é 492 arquivos MDX em um repositório Git em vez de linhas em um banco de dados MySQL, tudo muda:
- Cada post é um arquivo — o Claude Code pode ler, pesquisar e modificar em escala
- Cada mudança é um diff — você pode revisar exatamente o que mudou, em 50 posts de uma vez
- Cada funcionalidade é composável — seu sistema de newsletter pode ler os mesmos metadados de post que seu chatbot de IA
- Cada implantação é um comando —
pnpm build && vercel --prod, pronto
Com o WordPress, atualizar 12 posts do blog significava entrar no wp-admin, clicar em cada um, fazer mudanças, atualizar, repetir. Com arquivos MDX e Claude Code? Eu poderia dizer "adicione um link para o post central de parques nacionais em todos os 12 guias de parques existentes" e ele leria cada arquivo, adicionaria o link cruzado certo no contexto certo e me mostraria o diff. Todas as 12 atualizações em minutos.
Esse é o desbloqueio. Não a migração. A velocidade que vem depois.
Seis Mega Guias em 4 Dias
A primeira coisa que construí após a migração? Conteúdo. Muito conteúdo.
Queria escrever guias abrangentes para expatriados há meses — o tipo de post central de 2.000-4.000 palavras que realmente ajuda pessoas navegando pelo caos de se mudar para os EUA. O WordPress tornava isso penoso. Cada post exigia formatação manual, upload de imagens, configuração de plugin de SEO, gerenciamento de categorias.
Agora? O pipeline fica assim:
- Brainstorm da estrutura e esboço do post
- Escrever o MDX completo com otimização SEO/AEO integrada
- Gerar imagem em destaque — o Claude lê o post, escreve um prompt, envia para o Gemini gerar a imagem
- Otimizar — script Python converte para WebP, comprime para web
- Fazer upload para Vercel Blob
- Publicar —
git push,vercel --prod,pnpm db:publish - A Sydney já sabe sobre ele — o post é sincronizado com o Supabase com embeddings
Aqui está o que foi publicado nesses 4 dias:
| Post | Tema | Palavras |
|---|---|---|
| Guia de Saúde | HSA, FSA & HDHP explicados | ~3.200 |
| Construção de Crédito | Do zero ao score 720+ | ~3.500 |
| Poupança & Investimento | T-Bills vs HYSA | ~2.800 |
| Recompensas de Cartão | Estratégia de pontos, milhas e cashback | ~3.000 |
| Guia de Relocação | Roteiro completo de mudança para os EUA | ~3.800 |
| Parques Nacionais | 26 parques, 4 road trips | ~4.200 |
Cada post segue o mesmo padrão AEO: aberturas respondendo primeiro, tabelas de comparação, seções de 120-180 palavras, definições em negrito, FAQ schema no fim. O tipo de estrutura que recebe 340% mais citações de IA.
O guia de parques nacionais foi o maior — um post central ligando a 12 avaliações de parques existentes. Também construí um componente PhotoGallery para ele, porque rolar por 20 imagens individuais era brutal. Agora é uma grade limpa com lightbox. Simples, porém eficaz.
A Sydney Ficou Mais Inteligente
Quando trouxe a Sydney de volta durante a migração, ela funcionava — e a testei manualmente antes do lançamento. Ela conseguia responder perguntas, encontrar posts relevantes, citar fontes. Mas o teste manual só te diz "isso parece ok". Não te diz o quão ok, ou onde estão as lacunas, ou como melhorar.
Não tinha uma maneira sistemática de medir a qualidade — e sem medição, não tinha como melhorar.
Então construí um framework de avaliação de RAG. 32 consultas de teste em 12 categorias, cada uma com resultados esperados que curei manualmente. Perguntas como "Quais cartões de crédito expatriados devem obter?" deveriam retornar o guia de construção de crédito. "Me fale sobre Yosemite" deveria retornar o relato de viagem de Yosemite.
Depois testei 30 combinações diferentes de configuração — 6 thresholds de similaridade × 5 contagens de resultados — e medi hit rate, precisão e diversidade temporal.
Os resultados foram reveladores:
| Métrica | Antes (Padrão) | Depois (Otimizado) |
|---|---|---|
| Hit rate | ~30% | 81,2% |
| Consultas sem resultados | 6 de 30 | 0 de 30 |
| Dispersão temporal | 1,2 anos | 6,7 anos |
A maior correção foi constrangedora: o SDK da OpenAI estava silenciosamente descartando o parâmetro dimensions ao rodar no Next.js. A Sydney estava gerando embeddings de 1536 dimensões, mas pesquisando em um índice de 384 dimensões. Não é de espantar que os resultados fossem ruins. Mudar para chamadas diretas de fetch() resolveu o problema da noite para o dia.
Também expandi o prompt de sistema da Sydney para cobrir todos os 490+ tópicos do blog — agora ela sabe sobre parques nacionais, cartões de crédito, saúde e toda a biblioteca de conteúdo para expatriados. Não só IA e marketing.
Dois comandos para testar você mesmo:
pnpm eval:rag # Testar no Supabase local
pnpm eval:rag:prod # Testar em produção
Agora consigo realmente medir quando a Sydney fica mais inteligente. Esse é o tipo de infraestrutura que você nunca constrói quando está rodando WordPress.
SEO e AEO em Escala
SEO em 2026 não é mais só sobre o Google. É sobre ser citado pelo ChatGPT, Perplexity e Claude quando alguém faz uma pergunta que seu conteúdo responde.
Implementei uma stack completa de SEO/AEO em um único fim de semana:
Para busca tradicional:
- Sitemap dinâmico (639 páginas indexadas)
- Dados estruturados — schemas de Person, WebSite, Article, BreadcrumbList, FAQPage
- Feed RSS para distribuição
- Google Search Console verificado
Para mecanismos de IA (AEO/GEO):
llms.txt— um guia de conteúdo prioritário para crawlers de IA (GPTBot, Claude-Web, PerplexityBot todos permitidos norobots.txt)- Padrão resposta-primeiro em cada abertura de seção (declaração definitiva em negrito nas primeiras 150 palavras)
- H2s em formato de pergunta que correspondem a como as pessoas perguntam para assistentes de IA
- Seções de FAQ detectadas automaticamente e renderizadas como FAQPage schema
Para performance:
Usei o Chrome DevTools MCP para perfilar diferentes tipos de página — homepage, listagem de blog, posts individuais, a página /ask — e identifiquei gargalos. Conseguir executar um trace de performance, analisar os resultados e corrigir o problema na mesma sessão do Claude Code é... incrivelmente eficiente.
O resultado? Cada novo post que escrevo automaticamente recebe dados estruturados, FAQ schema (se tiver seção de FAQ) e é formatado para extração por IA. Sem plugins. Sem configuração manual. É simplesmente como o site funciona agora.
Beehiiv Saiu, Newsletter Nativa Entrou
Esse me surpreendeu. Eu tinha uma newsletter funcionando no Beehiiv. Coletava emails. Enviava atualizações. Por que substituir?
Três razões:
- Controle — Queria assinaturas por interesse. Assinantes de "IA & Tecnologia" não deveriam receber conteúdo de parques nacionais. O plano gratuito do Beehiiv não suportava isso.
- Integração — Meus dados de assinante agora vivem no mesmo banco de dados Supabase que o índice de busca da Sydney. Uma única fonte de verdade.
- Custo — Supabase (plano gratuito) + Resend (plano gratuito para baixo volume) = $0/mês.
O sistema que construí:
- Double opt-in — assinar → email de verificação → confirmado → email de boas-vindas com recomendações personalizadas
- 5 grupos de interesse — IA, Vida de Expatriado, Liderança, Marketing, Viagens & Parques Nacionais
- Correspondência inteligente — categorias de posts mapeiam automaticamente para interesses de assinantes. Quando publico um guia de cartão de crédito, apenas assinantes de "Vida de Expatriado" são notificados.
- Cron diário — Vercel executa um job às 11h PST, encontra posts das últimas 48 horas, envia notificações segmentadas
- Deduplicação — tabela
notification_logprevine emails duplicados, sempre
A melhor parte? O formulário de assinatura no final de cada post do blog pré-seleciona automaticamente o interesse relevante baseado na categoria do post. Lendo um artigo sobre IA? A pílula "IA & Tecnologia" já vem selecionada quando você rola para baixo para assinar.
Construir isso do zero parece muito trabalho. Foi uma tarde de trabalho focado. A migração do Supabase, as rotas de API, os templates de email e o cron job — o Claude Code cuidou do scaffolding enquanto eu me concentrei na lógica e no conteúdo.
Segurança: Invisível Até Você Precisar
Com um chatbot de IA acessível ao público e um formulário de assinatura de newsletter, eu tinha dois endpoints que os bots adoram abusar. A limitação de taxa já estava implementada (Upstash Redis, 5 requisições por minuto), mas queria uma segunda camada.
Entra o Cloudflare Turnstile — um CAPTCHA invisível que só mostra um desafio se suspeitar de atividade suspeita. Para 99% dos visitantes reais, é completamente invisível. Para bots? É uma parede.
Adicionei primeiro ao endpoint /ask (chat da Sydney), depois reutilizei exatamente o mesmo padrão para /api/subscribe. Mesma biblioteca de verificação, mesmo graceful degradation:
- Sem variáveis de ambiente configuradas → bypass (desenvolvimento local funciona sem isso)
- API do Cloudflare fora do ar → fail-open (o limitador de taxa é o fallback)
- Token ausente mas chave secreta configurada → rejeitar (captura bots que ignoram o frontend)
A reutilização é o que torna essa uma história de efeito composto. A integração do Turnstile para a newsletter levou minutos, não horas, porque a infraestrutura já estava lá da Sydney.
O Efeito Composto
Aqui está o que não planejei mas aconteceu naturalmente:
Migração para Next.js (1-5 fev)
└─→ Arquivos MDX permitem Claude Code ler/modificar conteúdo em escala
└─→ 6 mega guias escritos com otimização SEO/AEO (6-11 fev)
└─→ Novo conteúdo expõe problemas de qualidade de busca da Sydney
└─→ Framework de avaliação de RAG construído, Sydney otimizada (11 fev)
└─→ Mais conteúdo precisa de newsletter (não Beehiiv)
└─→ Newsletter nativa construída no Supabase (12 fev)
└─→ Endpoints públicos precisam de proteção contra bots
└─→ Turnstile adicionado à Sydney + assinar (12-13 fev)
Nada disso foi planejado como uma sequência. Cada um revelou a próxima necessidade. A migração tornou a criação de conteúdo rápida. A criação rápida de conteúdo expôs lacunas de qualidade de busca. Corrigir a busca me fez querer melhor distribuição. Melhor distribuição precisava de proteção.
Isso é efeito composto. Cada melhoria não apenas adiciona valor — multiplica o valor de tudo que veio antes. :)
E o fio condutor de tudo isso? Cada peça do meu site agora é código que pode ser lido, testado e modificado programaticamente. Esse é o verdadeiro desbloqueio.
Os Números
Porque eu sei que você está curioso:
| Métrica | Valor |
|---|---|
| Dias desde a migração | 8 |
| Novos posts do blog | 7 (incluindo este) |
| Novas funcionalidades entregues | 6 (newsletter, Turnstile ×2, avaliação de RAG, stack de SEO, PhotoGallery) |
| Posts do blog atualizados | 12+ (links cruzados, correções de links quebrados) |
| Linhas de código adicionadas | ~5.600 |
| Tabelas de banco de dados adicionadas | 2 (subscribers, notification_log) |
| Endpoints de API adicionados | 4 (subscribe, verify, unsubscribe, cron) |
| Aumento de custo | $0/mês (todos os planos gratuitos) |
O Que Vem a Seguir
Não terminei. O efeito composto não parou:
- Mais guias para expatriados — estratégia tributária, cronogramas de visto, comparações bancárias. A série tem fôlego.
- Sydney ficando mais inteligente — agora que consigo medir a qualidade, quero empurrar o hit rate acima de 90%.
- Mais análises sobre construção com IA — as ferramentas estão evoluindo semanalmente. Estou documentando conforme avanço. (Mais recente: construindo um app iOS nativo sem saber Swift e descobrindo que a IA te leva 60% do caminho — os últimos 40% é onde o produto realmente existe.)
Mas honestamente? Estou principalmente animado para continuar escrevendo. Pela primeira vez em 17 anos de blog, publicar um novo post é genuinamente divertido — não uma tarefa de 45 minutos no WordPress. :D
Você já experimentou esse tipo de efeito composto após uma migração ou uma grande decisão técnica? Tenho curiosidade — qual foi o primeiro desbloqueio inesperado que te surpreendeu?
Abraços,
Chandler
Perguntas Frequentes
O que é o efeito composto no desenvolvimento de sites?
O efeito composto é quando cada melhoria no seu site torna a próxima melhoria mais rápida e fácil. Por exemplo, migrar para um stack baseado em código habilitou a criação de conteúdo assistida por IA, que revelou problemas de qualidade de busca, que levou à construção de um framework de avaliação. Cada passo se baseou no anterior.
Como você otimiza posts de blog para mecanismos de busca de IA?
Mecanismos de busca de IA preferem conteúdo estruturado, resposta-primeiro com títulos claros e seções concisas. Técnicas-chave incluem: declarações definitivas em negrito nas primeiras 150 palavras, H2s em formato de pergunta, tabelas de comparação, seções de 120-180 palavras e FAQ schemas. Esses padrões obtêm até 340% mais citações de IA.
O que é um framework de avaliação de RAG?
Um framework de avaliação de RAG testa o quão bem seu assistente de IA encontra e retorna conteúdo relevante. Ele usa consultas predefinidas com resultados esperados (ground truth) e mede métricas como hit rate, precisão e diversidade temporal. Isso permite otimizar sistematicamente suas configurações de busca em vez de adivinhar.
Por que substituir o Beehiiv por um sistema de newsletter personalizado?
Um sistema de newsletter personalizado te dá controle total sobre dados de assinantes, segmentação por interesse e integração com seu banco de dados existente. Construindo no Supabase + Resend, obtive assinaturas por interesse, notificações automatizadas e hospedagem de $0/mês — tudo integrado ao índice de busca da Sydney.
Como o Cloudflare Turnstile difere dos CAPTCHAs tradicionais?
O Cloudflare Turnstile é um sistema invisível de detecção de bots que só mostra desafios para visitantes suspeitos. Ao contrário dos CAPTCHAs tradicionais que fazem todo usuário resolver puzzles, o Turnstile roda silenciosamente para usuários legítimos. Ele usa sinais do navegador para detectar bots sem interromper a experiência do usuário.
Ainda codando, ainda aprendendo, ainda assistindo o juro composto crescer.




