Back to all posts

Como automatizo a produção do nosso blog de ponta a ponta

Sou o Ming. Além de cuidar do design de produto na vm0, gerenciar nosso conteúdo também faz parte do que eu faço, e acabou tendo muito mais coisa envolvida do que eu esperava: design de fluxo de trabalho, ilustrações, produção de imagens, trabalho no CMS, traduções. É assim que venho conseguindo dar conta disso aos poucos.


Conteúdo é uma das coisas que faço por aqui

A maior parte do meu dia na vm0 se divide entre design de produto e nossa base de código em Next.js. Mas gerenciar nosso conteúdo também é responsabilidade minha, e assim que comecei, percebi o quanto realmente está envolvido em um blog que tem bons resultados. Você precisa de produção consistente, pesquisa de palavras-chave de verdade, visuais coerentes com a marca, meta descriptions decentes e traduções para os quatro idiomas que oferecemos.

Quando comecei a levar isso a sério, cada post tomava boa parte de um dia. A escrita acabou sendo só uma pequena fatia disso. A maior parte do tempo ia para o trabalho de produção em torno da escrita: encontrar as palavras-chave certas, criar as artes de capa, acertar os campos no CMS, refazer tudo para cada idioma.

Então fui movendo o máximo possível desse fluxo para o Lucas, um agente de marketing de IA que construí no Zero em torno da minha própria rotina. Ele está configurado como "Gerente de marketing", e o escopo dele é qualquer coisa relacionada a marketing: a produção de blog é a parte mais desenvolvida hoje, e ele continua crescendo à medida que adiciono skills e conectores ao longo do tempo.

Neste momento, o Lucas tem acesso ao nosso CMS headless Strapi, à nossa conta da Ahrefs, ao Slack do nosso time, ao nosso web chat, a uma skill interna chamada draw para ilustrações coerentes com a marca, além da skill padrão copywriting para a mecânica da escrita.

Abaixo vou mostrar como essa automação de blog com IA funciona na prática: como o Lucas pega um prompt vago, decompõe em tema e palavras-chave, escreve um post, desenha uma capa, passa o texto por uma tradução naturalística e entrega quatro rascunhos de idioma no nosso CMS headless. Depois vou falar sobre como cheguei até aqui, e o que deliberadamente deixo para os humanos (ainda na maior parte, eu).


Como uso o Lucas: web app e Slack

Várias bolhas de chat convergindo para um único agente de IA

Eu trabalho com o Lucas principalmente pelo web chat da vm0. É a interface de trabalho profundo, onde fico com ele ao longo da estruturação, da redação, das iterações de capa e das edições. Threads longas, contexto longo, aquele tipo de vai e volta que ficaria estranho em um canal de chat.

O Lucas também está conectado ao Slack do nosso time, como ponto de entrada compartilhado. Eu mando prompts rápidos por lá pelo celular, e o resto do time também pode chamá-lo. Quem estiver na escala do blog inicia um post da mesma forma. Mesmo agente, mesmo contexto nas duas interfaces.


Como costuma ser um prompt típico

Meus prompts para o Lucas costumam ser curtos. Três frases no máximo. Um exemplo representativo:

Lucas, escreva um tutorial sobre como conduzir reuniões semanais eficazes: aborde a estrutura da reunião, as armadilhas comuns e como manter times remotos engajados. Estilo tutorial, otimizado para SEO, termine com um CTA para usar o Zero. Só o link do rascunho, não publique.

É esse o briefing inteiro. Uma mensagem. Sem outline, sem lista de palavras-chave, sem briefing de design, sem meta de tamanho. O Lucas assume a partir daí.

Levei um tempo para chegar nesse formato. No começo, eu escrevia briefings bem mais longos porque presumia que o agente precisava de tudo detalhado, e então percebi que a maior parte do contexto pertence às instruções permanentes e às skills dele, não a cada prompt. O prompt é um gatilho; o resto da configuração carrega o peso.


Como o Lucas analisa o tema e as palavras-chave

Um funil estreitando de muitas tags de palavra-chave até uma única palavra-chave selecionada

O primeiro movimento do Lucas é extrair estrutura de um prompt vago. Para um pedido como o de cima, as anotações de trabalho dele ficam mais ou menos assim:

Depois ele escolhe a palavra-chave. Essa é a parte do marketing de conteúdo para a qual eu tinha menos intuição quando comecei, então dei ao Lucas uma rotina para percorrer sempre que eu peço trabalho de palavra-chave. Não é uma skill que ele roda de forma autônoma, é só uma sequência na qual confio a ele:

  1. Buscar candidatas na Ahrefs. Ele chama a API da Ahrefs com a frase do tema, retornando variações de cauda longa com volume de busca mensal, dificuldade da palavra-chave (KD), tema-pai e intenção da SERP.
  2. Filtrar por dificuldade. Dei a ele uma regra rígida: KD < 30. A vm0 é um domínio relativamente novo, com autoridade limitada, então perseguir palavras-chave de KD alto ainda não faz sentido para nós. A cauda longa vence no início.
  3. Cruzar com nosso índice do Strapi. Ele puxa todos os slugs publicados do nosso CMS via API REST do Strapi e remove qualquer palavra-chave que já cobrimos. Sem canibalização.
  4. Combinar intenção com o fit do produto. A intenção de uma palavra-chave precisa ser compatível com nossa biblioteca de casos de uso. "Como conduzir reuniões semanais eficazes" → operações / gestão de times → encaixa. "Melhor ramen em Tóquio" → não encaixa, não importa o volume.
  5. Escolher uma. Da lista filtrada, ele escolhe a opção de maior volume e a usa como espinha dorsal do post. Por exemplo, boas práticas de reuniões semanais remotas.

Para SEO on-page ele aplica uma heurística simples: palavra-chave alvo no título, em pelo menos um H2 e nas primeiras 100 palavras. Sinônimos e frases relacionadas tecidos naturalmente ao longo do texto. Links internos para dois ou três posts relacionados onde fizer sentido. Depois disso: escrever de forma natural, sem encher de palavra-chave.

A estrutura do post (seis ou sete H2s, um destaque "Dica:" sob cada passo, um CTA no fechamento) vem de um template de tutorial que fui montando por exemplo ao longo de vários posts.


Como a capa é desenhada

A capa é a parte da produção de blog com a qual mais me importo, em parte porque sou designer e em parte porque é o que os leitores veem antes de ler uma palavra. Ela também é a imagem do Open Graph quando os posts são compartilhados no X ou no LinkedIn, e é o que faz nosso índice de blog parecer uma publicação em vez de uma parede de fotos de banco de imagens.

Fotos de banco de imagens não eram uma opção para o visual que eu queria, e fazer briefing de ilustrações uma a uma teria tornado o custo de produção por post inviável. Então construí uma skill no Zero chamada draw. É um script Python de 200 linhas que faz cinco coisas:

  1. Recebe duas entradas: uma metáfora (o que esboçar) e uma cor (um nome amigável mais uma âncora em hex).
  2. Coloca-as em um template de prompt fixo que trava o resto da composição: fundo cinza quente #eeeeee, mancha aquarelada centralizada na tela na cor escolhida, esboço de tinta desenhado à mão por cima, logo da vm0 em (25, 25) no canto superior esquerdo.
  3. Envia o prompt composto para o modelo nano-banana-pro da fal.ai em 16:9.
  4. Baixa o PNG. Normaliza qualquer pixel quase branco de volta para exatamente #eeeeee, para que o fundo nunca se desvie. Faz upscale para 1600×900. Faz composição alpha do logo transparente da vm0 por cima.
  5. Faz upload do resultado para o CDN da vm0 e imprime a URL.

Uma invocação típica fica assim:

python draw.py \
  --metaphor "a tilted hourglass with sand draining into a small open notebook, a sparkle near the rim" \
  --color-name "dusty rose" \
  --color-hex "#e08b96" \
  --upload

Duas entradas e o resto da marca permanece consistente. Eu costumo escolher uma cor que combine com o tema do post. Coral ou verde-sálvia para peças mais calorosas em estilo tutorial, azul ou lavanda para as mais técnicas, amarelo-mostarda para anúncios. Algumas cores recorrentes vão aos poucos transformando o índice do blog em uma paleta reconhecível.

A coisa que descobri do jeito difícil é que a alavancagem não está no modelo. Está no template. Deixar o modelo escolher composição, paleta e layout livremente fazia cada capa parecer uma marca diferente. Travar tudo isso e deixar que ele escolha apenas a metáfora mantém o visual coerente de um post para o outro.

Existe uma skill irmã chamada illustration para arte pontual dentro do artigo (os desenhos menores que você vê entre as seções deste post). A mesma ideia: estilo fixo, só a metáfora e a cor variam. Apenas ajustada para arte quadrada de 1024×1024 em vez de capas 16:9.

Uma pequena nota sobre SEO de imagem: a mesma imagem de capa é configurada como ativo do Open Graph e do Twitter Card do post, então os compartilhamentos em redes sociais a capturam direitinho. O Strapi gera automaticamente quatro variantes pré-redimensionadas no upload (thumbnail, small, medium, large), embora eu ainda não tenha conectado o corpo do artigo para carregá-las via srcset. É um pequeno TODO de front-end. As ilustrações inline recebem um alt text descritivo escrito no markdown quando o Lucas as incorpora; o alternativeText da própria capa no Strapi é algo que ainda quero preencher depois.


Como o post é escrito

Um outline vertical à esquerda se expandindo para a direita em blocos de parágrafo preenchidos com uma lâmpada de dica

Uma vez que tema, palavra-chave e capa estão definidos, a redação é em boa parte mecânica. O Lucas:

  1. Estrutura primeiro. Seis ou sete H2s, cada um com uma função clara: enquadramento do problema, instruções passo a passo, destaques "Dica:", recapitulação, CTA.
  2. Expande cada H2 em prosa usando a skill copywriting. A voz (frases curtas, exemplos concretos, segunda pessoa quando funciona, um humor seco aqui e ali) vem de regras que mantenho nas instruções permanentes do Lucas, não da skill em si.
  3. Adiciona destaques práticos "Dica:" sob cada passo. Útil para tutoriais porque a maioria dos leitores passa o olho, e os destaques dão a eles um caminho ao longo de um conteúdo longo.
  4. Escreve o campo description do post. O Strapi limita a 80 caracteres, então ele fica curto e soa como se um humano tivesse escrito. É usado como subtítulo do artigo e como descrição do card de OG/Twitter.
  5. Fecha com um CTA que nomeia o produto e leva a um workspace gratuito.

Um primeiro rascunho costuma voltar dois ou três minutos depois do prompt. Eu leio, peço ajustes de tom onde a voz está fora, e o Lucas itera até acertar. O primeiro rascunho raramente está pronto para publicar. Geralmente está quase lá, mas um pouco fora, e é aí que gasto a maior parte do meu tempo de revisão.


Como o rascunho chega ao Strapi

Um pacote de rascunho embrulhado sendo colocado em uma caixa de correio do CMS com um ícone de pausa pairando acima

Usamos o Strapi como nosso CMS headless. O content type articles tem um cover (mídia), author e category (relações), locale (string) e uma dynamic zone blocks onde o corpo fica.

O fluxo de sincronização com o CMS do Lucas:

  1. POST do PNG da capa para /api/upload. Salva o documentId retornado.
  2. POST para /api/articles?status=draft com título, description (≤80 caracteres; o Strapi impõe isso), slug, locale, as relações de cover/author/category como IDs numéricos, e um único bloco shared.rich-text contendo o corpo em markdown.
  3. O crucial: omitir publishedAt. O Strapi trata null como estado de rascunho.
  4. Retorna uma URL de preview usando o padrão de rascunho da vm0: https://www.vm0.ai/{locale}/blog/posts/{slug}?status=draft.

Um aviso sobre o Strapi v5: a API REST pública pode sobrescrever o publishedAt em certos content types, o que significa que um "rascunho" criado pela API pode ir ao ar silenciosamente. A correção é uma pequena migração de banco que remove o campo nas gravações de rascunho.

A estratégia de slug também importa para o SEO. Usamos um slug canônico em todos os quatro idiomas, em vez de traduzi-lo. Um leitor em /de/blog/posts/remote-weekly-meeting-best-practices vê a mesma estrutura de URL que um leitor em /en, e nosso perfil de backlinks não se fragmenta em URLs traduzidas. Emitir as tags de link hreflang a partir dessas relações de locale é um pequeno TODO de front-end. Ainda não as entregamos.


Como funciona a tradução i18n

Um documento central se abrindo em quatro cópias menores rotuladas EN, DE, JA, ES

A vm0 opera em quatro idiomas: inglês, alemão, japonês, espanhol. Não passamos os posts pelo Google Translate. O caminho barato destrói a voz; o caminho certo adapta as expressões.

O Lucas cria o rascunho em EN primeiro, captura o documentId retornado e então faz três chamadas de acompanhamento PUT /api/articles/{documentId}?locale=de (e ?locale=ja, ?locale=es) com payloads traduzidos de forma naturalística. O Strapi trata essas chamadas como variantes de idioma do mesmo documento canônico, o que mantém as quatro versões vinculadas no admin e no seletor de idioma do front-end.

Regras de tradução que dei a ele, em boa parte por ter esbarrado em saídas erradas e corrigido:

A publicação de conteúdo multilíngue era a parte do fluxo que costumava consumir mais tempo. Agora é só o último passo na mesma execução do agente.


O que não é automatizado

Uma seção curta, mas importante. Nem tudo nesse fluxo é automatizado, de propósito:

A ideia não é me tirar do loop. É me tirar das partes do loop que realmente não precisam de mim.


Como cheguei a esse fluxo

Eu não sentei num fim de semana e projetei isso. Foi se acumulando, post a post, a partir de perceber quais passos estavam consumindo meu tempo.

O que percebi: as partes que valiam a pena automatizar não eram as partes criativas. Eram as partes de conexão: as buscas de palavra-chave, as renderizações de capa, as chamadas de upload, o fan-out de idiomas, a formatação da URL de preview. Quando registrei isso com honestidade, eu estava gastando mais tempo com logística do que com a escrita em si.

Então fui movendo a logística para o agente. O modelo escreve; o agente cuida de mover as coisas de um lado para o outro. Eu ainda sou quem toma as decisões sobre o que escrever e como deve soar, só não sou mais quem costura as peças.

Para mim, a automação de conteúdo na prática não acabou sendo "a IA escreve o blog". Acabou sendo "a IA faz tudo ao redor da escrita, para que eu tenha tempo de realmente olhar para a escrita".


Se você quiser tentar algo parecido

Se você está numa situação parecida, vestindo mais chapéus do que gostaria, com conteúdo sendo um deles, boa parte disso é reproduzível:

Comece um workspace gratuito no Zero →

Ou, se você preferir ver mais fluxos de trabalho de agentes antes de se cadastrar, nossa biblioteca de casos de uso tem 19 automações prontas para copiar em engenharia, produto, marketing e operações.

Se você quiser clonar o Lucas especificamente: crie um agente, dê a ele o papel de Gerente de marketing, conecte o Strapi (ou seu CMS) + Ahrefs + uma ferramenta de geração de imagens, adicione uma skill draw modelada na sua, e uma skill copywriting que capture a voz da sua marca. Ele vai descobrir o resto a partir do seu primeiro prompt.

Related Articles

Stay in the loop

// Get the latest insights on AI teammates and collaboration.

SubscribeJoin Discord