Carrossel automático no Instagram com Claude, GPT-Image e Make
Passo a passo do carrossel automático no Instagram: o Claude escolhe a notícia, o GPT-Image faz a capa, o servidor monta os slides e o Make publica.
Sumário do artigo
- O sistema em uma tabela
- O que você precisa antes de começar
- Etapa 1: buscar notícias sem repetir pauta
- Etapa 2: o Claude escolhe a notícia e escreve tudo
- Validação em código, depois da resposta
- Etapa 3: a imagem da capa com GPT-Image
- Nem toda capa precisa de foto
- Etapa 4: montar capa e slides no servidor
- Etapa 5: publicar com o Make
- Regras de tentativa
- Erros comuns e como evitar
- O que fazer agora

Todo dia de manhã, um carrossel sai no Instagram do lowcode.ai sem eu abrir nada. Um agente busca as notícias, o Claude escolhe uma e escreve os slides, o GPT-Image gera a imagem da capa, o servidor monta as seis imagens e o Make publica. Quando algo dá errado, o motivo aparece no painel.
Este é o passo a passo completo desse carrossel automático no Instagram, etapa por etapa, com os campos, os prompts e os erros que me custaram semanas. Ele foi pensado para quem não é desenvolvedor, mas não pula a parte técnica: os nomes das ferramentas, das tabelas e dos módulos são os reais.
O sistema em uma tabela
| Etapa | Ferramenta | O que entrega |
|---|---|---|
| 1. Buscar notícias | Brave Search API | Lista de notícias recentes por tema |
| 2. Escolher e escrever | Claude, pela API da Anthropic | Um JSON com capa, slides, legenda e hashtags |
| 3. Gerar a imagem da capa | GPT-Image, pela API da OpenAI | Uma foto sem nenhum texto |
| 4. Montar capa e slides | Rota no servidor com pureimage | As 6 imagens finais do carrossel |
| 5. Agendar e publicar | Supabase (pg_cron) e Make | Post no ar e status de volta no painel |
O site e o painel foram construídos no Lovable, com Supabase como banco. Cada etapa grava o resultado numa tabela instagram_posts, e a etapa seguinte lê de lá. Essa separação é o que permite que uma etapa falhe sem derrubar as outras.
O que você precisa antes de começar
Você vai precisar de um projeto no Supabase, de chaves de API da Anthropic, da OpenAI e da Brave Search, de uma conta no Make e de uma conta profissional no Instagram (comercial ou de criador) conectada a uma página do Facebook, que é o que o Make pede para conectar o Instagram.
Guarde as chaves como segredos das edge functions do Supabase, nunca no código do front-end. Se o seu projeto foi feito com IA, vale passar antes pelo checklist de segurança do Lovable com Supabase.
Etapa 1: buscar notícias sem repetir pauta
A busca roda numa edge function do Supabase (daily-news-instagram). Ela lê a lista de temas configurada no painel e consulta a Brave Search API para cada um.
Os temas aceitam sinônimos separados por barra vertical. Um tema genérico como "inteligência artificial" traz de tudo, de chip a política pública. Com sinônimos, a busca fica mais perto do público:
vibe coding, inteligência artificial|agentes de IA|IA generativa, SaaS, automação
O rótulo do tema é o primeiro termo antes da barra. É ele que aparece no selo da capa e define a cor de destaque.
Dois cuidados nessa etapa:
- A Brave entrega só o título e duas ou três frases de cada notícia. Antes de pedir ao Claude para escrever, o sistema baixa o texto completo da página de origem. Sem isso, o modelo preenche lacunas com suposição.
- Toda notícia usada vai para uma tabela de log (
news_automation_log) com a URL e uma assinatura do título. Na próxima busca, qualquer candidata já registrada é descartada. É assim que o mesmo assunto não aparece três dias seguidos vindo de sites diferentes.
Etapa 2: o Claude escolhe a notícia e escreve tudo
Os candidatos vão para o Claude num único pedido. O prompt define a ordem de critérios para a escolha:
- Aplicabilidade: a notícia muda algo que um criador ou founder brasileiro pode fazer ou decidir nesta semana.
- Tema pouco usado nas publicações recentes.
- Atualidade.
A resposta precisa ser um JSON com campos fixos. Este é o formato, com valores de exemplo:
{
"headline_image": "Título interno do post, até 90 caracteres",
"cover_hook": "Frase da capa, até 60 caracteres",
"cover_highlight": "palavras do hook que ganham cor",
"cover_archetype": "manchete",
"visual_subject": "a laptop on a dark desk with a glowing server rack behind it",
"carousel_slides": [
{ "title": "O que aconteceu", "body": "Texto do slide 2" },
{ "title": "Por que importa", "body": "Texto do slide 3" }
],
"caption": "Legenda completa",
"hashtags": ["automacao", "vibecoding", "nocode"]
}
O ponto que mais melhorou o resultado foi separar o título interno da frase da capa. O cover_hook é escrito para quem está rolando o feed: fala do impacto no leitor, com a palavra-chave no começo. O visual_subject descreve em inglês a cena que representa a notícia. Quem leu a notícia foi o Claude, então é ele que descreve a imagem, e não o modelo de imagem tentando adivinhar a partir do título.
Validação em código, depois da resposta
Nunca confie no JSON sem conferir. O sistema aplica estas regras antes de gravar:
| Campo | Regra | Se falhar |
|---|---|---|
cover_hook |
Até 60 caracteres | Usa o headline_image |
cover_highlight |
Precisa ser trecho exato do hook | Descarta o destaque |
| Número da capa | Precisa aparecer no texto da fonte | Troca o arquétipo para manchete |
| Todo texto | Sem travessão | Remove com uma função de limpeza |
| Hashtags | De 3 a 5 | Corta o excesso |
A regra do número é a mais importante. Modelo de linguagem inventa estatística com muita naturalidade, e uma capa com "73%" que não existe na fonte destrói a credibilidade do perfil.
Etapa 3: a imagem da capa com GPT-Image
Aqui está o erro que mais me custou. Na primeira versão, o prompt pedia para o modelo de imagem escrever a manchete na capa. O resultado: cada capa saía com uma tipografia diferente, apareceu uma data inventada ("MAIO/2025") em posts de outubro de 2026, e a cena vinha cheia de textos soltos, como placas e carimbos, competindo com o título.
A regra hoje é simples: o modelo de imagem nunca escreve. Ele gera só a foto, e todo texto é aplicado depois, em código. O final do prompt de imagem tem esta instrução, que prevalece sobre qualquer outra:
Absolutely no text, letters, numbers, logos, signs, stamps, labels or
readable screens anywhere in the image. One large, recognizable central
subject. Keep the lower 45% of the frame darker and visually simple,
and the top 15% clean.
A parte de baixo escura e limpa é onde o título vai entrar. O topo limpo é onde ficam o logo e o selo do tema. A cor do tema também entra no prompt como cor de luz da cena, para a foto conversar com o selo.
Nem toda capa precisa de foto
O sistema trabalha com cinco formatos de capa, e o Claude escolhe um por post:
| Arquétipo | Quando usar | Usa imagem IA |
|---|---|---|
| Manchete | Caso geral | Sim |
| Versus | Disputa entre duas empresas ou ferramentas | Sim |
| Número | A notícia tem um dado forte e verificável | Não |
| Logos | Duas ou mais marcas conhecidas envolvidas | Não |
| Lista | O assunto se organiza em itens | Não |
Variar o formato evita um grid onde todas as capas parecem iguais, e cortar a geração de imagem onde ela não é necessária reduz custo e tempo. A imagem bruta vai para o storage e o post fica marcado com pending_template_render = true, esperando a etapa seguinte.
Etapa 4: montar capa e slides no servidor
Uma rota do próprio site (/api/public/hooks/renderizar-carrosseis) pega até 5 posts pendentes por vez e desenha as imagens com pureimage, uma biblioteca de canvas em JavaScript puro que roda no Cloudflare Workers.
Para a capa, ela desenha a foto de fundo, escurece a parte de baixo em faixas semitransparentes, aplica o selo do tema, o título com o destaque colorido e o logo. Para os slides 2 a 6, ela usa um template fixo com título, texto e paginação. O canto superior direito da capa fica sempre vazio, porque é ali que o Instagram coloca o ícone de carrossel no grid.
Essa rota é chamada de dois jeitos. Logo depois da etapa 3, a edge function dispara a rota uma vez, então o carrossel costuma ficar pronto em poucos minutos. E o banco chama a mesma rota a cada 5 minutos, como rede de segurança:
-- Chama a rota de render a cada 5 minutos (horário em UTC)
select cron.schedule(
'renderizar-carrosseis-every-5min',
'*/5 * * * *',
$$
select net.http_post(
url := 'https://seusite.com.br/api/public/hooks/renderizar-carrosseis',
headers := '{"Content-Type": "application/json", "x-cron-secret": "SEU_SEGREDO"}'::jsonb,
body := '{}'::jsonb
);
$$
);
Antes de desenhar um post, a rota grava render_started_at nele. Se o disparo imediato e o cron chegarem ao mesmo tempo, só um processa o post. Por que essa etapa fica no servidor, e não no navegador, está contado em detalhe em navegador ou servidor: onde gerar as imagens da sua automação. E se a sintaxe do cron ainda é estranha, comece pelo explicador de cron job.
Etapa 5: publicar com o Make
A publicação também começa no Supabase. Uma edge function (publish-scheduled-instagram), chamada por cron a cada 5 minutos, procura posts com horário vencido e imagens prontas e envia cada um para um webhook do Make.
O cenário no Make tem esta estrutura:
- Webhook personalizado, que recebe o post.
- Módulo de carrossel do app Instagram for Business, que recebe a lista de URLs das imagens e a legenda.
- Módulo HTTP que avisa o site que deu certo.
- Uma rota de tratamento de erro no módulo do Instagram, com outro módulo HTTP que avisa o site que falhou.
O payload que o site manda e o retorno que ele espera:
// O que o site envia para o webhook do Make
{
"post_id": "uuid do post",
"image_urls": ["https://.../capa.jpg", "https://.../slide-2.jpg"],
"caption": "Legenda com hashtags",
"callback_token": "token secreto deste envio"
}
// O que o Make devolve no callback
{
"post_id": "uuid do post",
"success": false,
"error": "mensagem real do módulo do Instagram",
"callback_token": "o mesmo token recebido"
}
O token de callback impede que alguém de fora marque posts como publicados. O campo error é onde muita gente tropeça: no meu cenário, a rota de erro mandava "error": "", e o painel só dizia que o Make retornou falha sem motivo. Mapeie a mensagem de erro do módulo do Instagram nesse campo e a próxima falha já vem explicada. Se você está decidindo entre Make e n8n para essa parte, a comparação está em Make vs n8n.
Regras de tentativa
O publicador tenta no máximo 6 vezes. Enquanto as imagens ainda estão sendo montadas, ele não conta tentativa: só espera a próxima rodada, por até 2 horas depois do horário agendado. Sem essa regra, um atraso no render vira uma falha de publicação, que foi exatamente o que acontecia comigo antes.
Erros comuns e como evitar
| Sintoma | Causa | Como evitar |
|---|---|---|
| Carrossel preso em "renderizando" | Render dependia de uma aba aberta | Render no servidor, chamado por cron |
| Post saindo horas fora do horário | pg_cron roda em UTC | 7h de Brasília é 0 10 * * * |
| Capa com texto torto ou data errada | Modelo de imagem escrevendo | Proibir texto na imagem e compor em código |
| Número que não existe na notícia | Estatística inventada pelo modelo | Validar o número contra o texto da fonte |
| Falha sem explicação | Callback sem mensagem de erro | Mapear o erro do módulo no callback |
| Mesmo assunto vários dias seguidos | Sem registro de pautas usadas | Log com URL e assinatura do título |
O que fazer agora
- Desenhe as cinco etapas no papel e defina qual tabela cada uma lê e grava. Um status por etapa (
pending_template_render,scheduled,published,failed) já resolve a maior parte da coordenação. - Escreva o prompt do Claude pedindo JSON com campos fixos e implemente a validação da tabela da etapa 2 antes de gerar qualquer imagem.
- Tire todo texto do prompt de imagem e reserve as áreas do título e do logo com instruções de composição.
- Coloque o render numa rota de servidor com reserva por
render_started_ate agende essa rota no pg_cron. - Monte o cenário do Make com rota de erro e callback com mensagem. Teste forçando um erro (uma URL de imagem inválida) e confira se o motivo aparece no painel.
- Rode a automação manualmente por uma semana, olhando cada post antes de sair, e só então deixe tudo no automático.
Não perca a próxima edição.
Toda quinta, 9h. Direto na sua caixa.
- Ferramentas que economizam horas do seu trabalho
- Agentes e automações que funcionam
- Bastidores do que estamos construindo