Capas de Reels
Cada reel ganha a sua própria capa. Ela é construída com suas fotos reais e configurada com sua tipografia real, mantendo o texto dentro da área que o Instagram mostra no grid do perfil.
Config: defina sua marca aqui
Edite estas opções uma vez antes da primeira execução.
| configuração | onde | padrão |
|---|---|---|
| cor de destaque | --brand em scripts/cover.html | #3b82f6 |
| fonte do título | --display-font em scripts/cover.html | Anton (grátis, Google Fonts) |
| fonte do subtítulo | .sub em scripts/cover.html | Montserrat Bold (grátis) |
| subtítulo padrão | suas capas | ex. "de um Cozinheiro Caseiro", ou nenhum |
| pasta de fotos | photos_dir em library.json | <CAMINHO_PARA_SUAS_FOTOS_DE_CAPA> |
| pasta de fotos no Canva (opcional) | canva_folder em library.json | <SEU_ID_DE_PASTA_NO_CANVA> |
| documento mestre de capas no Canva (opcional) | referência para seu estilo atual | <SEU_ID_DE_DOC_MASTER_DE_CAPA_NO_CANVA> |
| design rascunho no Canva (opcional) | usado para exportar fotos do Canva | <SEU_ID_DE_DESIGN_RASCUNHO_NO_CANVA> |
| log de capas | variável de ambiente COVER_LOG para pick.py | drafts/social/cover-log.json na raiz do projeto |
| onde as capas finalizadas vão | passo 8 | <SUA_PASTA_DE_VIDEOS>/<Video> YYYY-MM-DD/Covers/ |
| palavras proibidas | regras em hooks.md | sua lista (ex. nome de uma oferta antiga) |
Feito para o Instagram. A capa pode ser usada em uma postagem normal do IG + TikTok + Shorts como a miniatura do vídeo (ex. videoThumbnailUrl do Metricool). Apenas o grid do Instagram importa para o design. Nunca substitua uma capa que uma postagem já possui.
Nunca use IA para gerar a imagem. Os fundos são suas fotos e os layouts são copiados das suas capas. O código apenas os organiza.
Estilo padrão da marca (mude a gosto)
Referencie apenas suas capas mais recentes no seu documento mestre. Estilos antigos dos quais você já se desfez não contam.
- uma foto sua brilhante e neutra com um adereço relevante (notebook, câmera, celular, produto), com parede lisa onde o texto será colocado
- o título em fonte de exibição branca, EM CAIXA ALTA sempre, centralizado, 2 ou 3 linhas, bem pequeno
- um subtítulo opcional em Montserrat Bold, maiúsculas e minúsculas normais
- padrão: sem sombra, sem contorno, sem faixa ou escurecimento atrás do texto, sem texto colorido com a cor de destaque
- sem rótulos, sem tipo inclinado, sem fontes cursivas ou de script, sem layouts de números grandes ou séries
- o único extra: uma seta simples desenhada à mão na cor de destaque, de vez em quando
- nada abaixo do ícone do reel: o grid do Instagram coloca o ícone no canto superior direito de cada tile. O render.mjs avisa se algo estiver em x acima de 760 e y abaixo de 540.
As regras de título, tipos de gancho e rótulos estão em hooks.md. Leia-o antes de escrever um título.
Arquivos
scripts/cover.html | o único layout: título + subtítulo opcional, além dos extras arrow / inset / avatar. Configuração da marca no topo. |
scripts/render.mjs | renderiza JPGs de 1080x1920 + ambas as provas, e avisa sobre texto fora da zona segura ou arquivos acima de 8MB |
scripts/pick.py | lista as melhores fotos por tópico, bloqueia as últimas 9 usadas e exibe os layouts e tipos de gancho recentes |
library.json | cada foto, marcada (pose, adereços, onde está o espaço vazio, ponto de foco). Inclui um exemplo; construa o seu. |
log de capas (COVER_LOG) | cada capa publicada. Isso evita repetições |
photos_dir | suas fotos em alta resolução (apenas local, mantenha fora do git) |
scripts/ precisa de puppeteer-core (npm i puppeteer-core em scripts/, ou faça um symlink de scripts/node_modules para a instalação de outra skill) além do Google Chrome e ffmpeg. O render.mjs aponta para o caminho padrão do Chrome no macOS; altere executablePath se o seu for diferente.
Como executar
1. Conheça o reel. Você precisa da transcrição, legenda e cartela de texto inicial de cada reel. Nomeie a única promessa que o reel faz.
2. Título. Escolha um tipo de gancho que não seja o mesmo da última capa (pick.py exibe). Escreva 3 ou 4 opções, de 3 a 8 palavras cada, e escolha a mais forte. Ele não deve repetir a cartela de texto inicial palavra por palavra.
3. Foto.
python3 .claude/skills/reel-covers/scripts/pick.py "<palavras do tópico>" --space top
Depois veja as 3 ou 4 principais antes de escolher (crie uma folha de contato com ffmpeg). Combine o adereço com o tópico: notebook para e-mail, sistemas ou site; câmera ou produto para equipamentos; você falando para vendas e mentalidade. Para histórias de clientes, use um inset ou avatar do cliente (com permissão).
4. Layout. Não igual ao da última capa (veja pick.py). Coloque o texto no espaço vazio da foto (space), defina focus para que o rosto fique visível e ajuste y para que o bloco de texto fique entre 300 e 1250.
5. Renderizar.
OUT="<trabalho>/covers" node .claude/skills/reel-covers/scripts/render.mjs covers.json
{"covers":[{"id":"3-o-fechamento-exato","img":"<CAMINHO_PARA_SUAS_FOTOS_DE_CAPA>/<arquivo>.jpg",
"data":{"head":"o fechamento exato que uso em ligações de vendas","sub":"de um Cozinheiro Caseiro","y":560,"headroom":280}}],
"history":["<últimas capas enviadas do log de capas, mais recentes primeiro>"]}
Expanda ~ para um caminho real; o render.mjs não faz isso. Uma saída diferente de zero significa um aviso, então corrija antes de compartilhar.
6. Verifique você mesmo primeiro. Abra _proof.png e _grid-phone.png:
- O título está legível na prova do grid (130px de largura)? Se não, corte palavras.
- O rosto está livre do texto tanto na capa completa quanto no corte do grid?
- Ao lado das outras capas no grid, parece diferente (foto, layout, posição do texto) mas claramente do mesmo conjunto?
7. Aprovação. Mostre ao usuário _grid-phone.png e _proof.png, com cada título e uma alternativa. Pergunte: "Essas capas fazem parar a rolagem?" Troque fotos ou palavras conforme solicitado e re-renderize. Leva segundos.
8. Após a aprovação:
- Copie cada JPG para
<SUA_PASTA_DE_VIDEOS>/<Video> YYYY-MM-DD/Covers/, nomeado como o reel (3. o fechamento exato.jpg). - Adicione uma entrada por capa ao log de capas:
{"date":"YYYY-MM-DD","video":"<slug-do-video>","reel":"3. o fechamento exato","photo":"<arquivo>","layout":"stack","hook_type":"how","head":"o fechamento exato que uso em ligações de vendas","file":"<caminho absoluto para o JPG da capa>"} - Passe os arquivos para a etapa de agendamento, que faz upload de cada um e o anexa à postagem do Instagram.
Regras de exclusividade
- Nenhuma foto usada nas últimas 9 capas. O
pick.pyaplica isso. - Nunca o mesmo layout ou tipo de gancho duas vezes seguidas.
- Alterne o subtítulo: nenhum, centralizado, ou deslocado à direita e inclinado (
subdx,subrot). - Varie a posição do texto (superior, meio, alinhado à esquerda ou direita) com base na foto. Não o centralize sempre no topo.
- Se a biblioteca estiver escassa (todas as boas fotos usadas recentemente), informe e sugira uma nova sessão de fotos em vez de quebrar a regra.
Lições de layout
- O corte 9:16 coloca o rosto no alto. A maioria das fotos é 2:3. Escaladas para 1920 de altura, perdem as laterais, não o topo, então um rosto que parece baixo na original fica por volta de y 600 a 800. O erro mais comum é o texto ficar sobre o cabelo do sujeito. Verifique cada prova para isso antes de qualquer outra coisa.
- Corrija com
headroom, não diminuindo o texto."headroom": 150-350empurra a foto para baixo e estica a parede lisa acima do sujeito. É invisível em paredes de estúdio lisas. Não use em fundos externos movimentados (árvores e céu borram). - Tamanho do título: automático é 104px para 4 palavras ou menos, 84px para mais, encolhendo para caber em 3 linhas.
- Remova o subtítulo se ele tocar a cabeça. É textura, não a mensagem.
- Posicionar o texto pensando no ícone do reel: comece o bloco em y 560 ou mais baixo (empurre a foto para baixo com
headroompara que ele limpe a cabeça), ou mantenha-o alto e usealign: left, right: 320. Misture ambos em um lote. - Um corte de grid 3:4 não esconde nada acima de y 240. Mantenha o texto começando em 280 ou mais baixo (render.mjs avisa).
Como adicionar fotos
De uma pasta local: verifique md5 contra photos_dir para duplicatas, copie como <nome>-<k>__local<MMDD>.jpg, depois marque.
Do Canva (opcional). O Canva não baixa imagens diretamente de uma pasta de uploads. Uma rota funcional é um design rascunho usado apenas para exportações:
list-folder-itemsem<SEU_ID_DE_PASTA_NO_CANVA>, e diferencie os ids dos assets contralibrary.json(mantenha o id em cada nome de arquivo após__).read-designem<SEU_ID_DE_DESIGN_RASCUNHO_NO_CANVA>comopen_transaction, depois uma chamadaedit-designcom umadd_page(2400x3600, título = id do asset) para cada nova foto. Leia os ids das novas páginas, depois uma chamada com uminsert_fillpor página (página inteira,top 0, left 0).commit.export-designcomo PDF,export_quality: pro, depoispdfimages -j -f <primeiro> -l <último> -p all.pdf ex/img. O PDF incorpora os JPEGs originais intocados. A exportação JPG também funciona, mas dá uma URL por página.- Salve cada um como
<nome>__<assetid>.jpgemphotos_dir. Várias fotos podem compartilhar um nome no Canva, então o id as mantém separadas. Depois, marque-as.
Se a mesma foto foi enviada duas vezes, mantenha uma cópia ok e marque a outra "ok": false, "note": "duplicata de N", ou a regra de não repetição pode pegar a mesma imagem duas vezes.
Marque cada novo arquivo em library.json olhando para ele:
{"file":"photo_-13.jpg","pose":"sorrindo para o notebook","props":["notebook","mesa"],"topics":["email","seguir","sistemas","site"],
"cap":false,"space":["top"],"focus":"50% 55%","ok":true}
space é onde o texto pode ir sem tocar o rosto. Marque fotos borradas, escuras ou estranhas como "ok":false em vez de excluí-las.
Relacionados
video-reels: a cartela de texto inicial, que o título da capa não deve repetir- uma skill de agendamento (opcional): faz upload das capas e agenda os reels