CommunityImagemgithub.com

mohitagw15856/thumbnail-creator

Gere miniaturas para artigos ou newsletters usando a API Gemini diretamente no Claude Code. Claude lê o texto, propõe conceitos de composição, escreve prompts de geração de imagem incorporando especificações da marca, chama o Gemini para gerar as imagens, avalia os resultados via visão computacional e retorna candidatos ranqueados com justificativa.

O que é thumbnail-creator?

Esta skill permite que o Claude Code atue como um agente completo de geração de imagens para criar miniaturas de artigos e newsletters. Em vez de alternar entre ferramentas ou usar a interface web do Gemini manualmente, a skill automatiza todo o fluxo: o Claude analisa o texto do artigo, propõe composições visuais personalizadas, escreve prompts detalhados para o modelo Gemini Imagen, executa a geração das imagens e, em seguida, avalia cada resultado usando visão computacional para verificar a fidelidade à marca e a legibilidade do texto. O resultado é uma lista de candidatos ranqueados com recomendações específicas para diferentes plataformas (web, email, redes sociais). A skill é particularmente útil para criadores de conteúdo, profissionais de marketing e editores que precisam de miniaturas profissionais e consistentes com a marca sem sair do ambiente de linha de comando. Ela suporta especificações completas de marca (cores, fontes, estilo visual), geração em lote de múltiplos candidatos e um formato de saída estruturado que inclui conceitos de composição, imagens geradas e um relatório de avaliação detalhado.

Funciona com✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/mohitagw15856/pm-claude-skills/tree/HEAD/skills/thumbnail-creator

Installed? Explore more Imagem skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Habilidade de Criador de Miniaturas (via Gemini)

Gera candidatos a miniaturas para artigos e newsletters atuando como um agente de geração de imagens dentro do Claude Code. Em vez de alternar entre ferramentas e solicitar imagens uma por uma na interface web do Gemini, esta habilidade faz o Claude executar o ciclo completo: ler o texto, propor composições, escrever prompts personalizados, chamar a API Gemini, avaliar os resultados e retornar resultados ranqueados com uma breve justificativa.

O resultado são candidatos a miniaturas prontos para produção, que você pode colocar diretamente no seu CMS, ferramenta de newsletter ou agendador de redes sociais.


Pré-requisitos

Ambos devem estar em vigor antes que a habilidade possa gerar imagens:

1. Chave da API Gemini

Obtenha uma chave gratuita em Google AI Studio.

Defina-a como uma variável de ambiente:

export GEMINI_API_KEY=<sua-chave>

Para mantê-la entre sessões, adicione ao seu perfil de shell (~/.zshrc ou ~/.bashrc):

echo 'export GEMINI_API_KEY=<sua-chave>' >> ~/.zshrc
source ~/.zshrc

Verifique se está definida:

echo $GEMINI_API_KEY

2. Script generate_image.py

Este script deve existir em ./generate_image.py na raiz do projeto. O modelo completo está na seção Modelo de Script abaixo. O Claude verificará se ele existe e se oferecerá para criá-lo, caso esteja faltando.

Dependências Python:

pip install google-generativeai Pillow requests

Ou com uv:

uv pip install google-generativeai Pillow requests

Entradas Necessárias

O Claude perguntará por estas informações se não forem fornecidas:

EntradaObrigatórioObservações
Texto do artigo ou URLSimCole o texto completo do artigo ou forneça uma URL para buscar. Usado para extrair temas, ganchos e principais afirmações para a composição.
Cores da marcaRecomendadoCódigos hexadecimais ou nomes descritivos. Ex.: #1A1A2E (azul marinho), #E94560 (coral). Se não for fornecido, o Claude usa padrões neutros e limpos.
Fontes / estilo de tipoRecomendadoEx.: "sans-serif negrito", "serif editorial", "Neue Haas Grotesk". Usado no prompt para orientar o tratamento do texto.
Descrição de referência de estiloRecomendadoEx.: "ilustração plana, minimalista, como o site de marketing do Stripe" ou "fotorrealista, fundo escuro, alto contraste". Uma URL de imagem de estilo também pode ser fornecida.
Dimensões de saídaNãoPadrão: 1792x1024 (paisagem, miniatura de artigo padrão). Opções: 1024x1024 (quadrado), 1024x1792 (retrato/mobile).
Número de candidatosNãoPadrão: 4. Mínimo 1, máximo 8 (limites da API e custo).
Título do artigo (se diferente do H1)NãoUsado como o elemento de texto principal nos prompts de imagem.
Seleção de candidatosNãoApós propor composições, o Claude pergunta quais gerar. O usuário pode dizer "todos" ou escolher por número.

Estrutura de Saída

Fase 1 — Propostas de Composição (texto, antes de qualquer chamada de API)

O Claude apresenta de 3 a 4 conceitos de composição para aprovação do usuário. Formato:

Conceitos de Composição para: "[Título do Artigo]"

1. AFIRMAÇÃO IMPACTANTE
   Layout:    Fundo escuro com sangria, título grande branco centralizado,
              ponto de dados de destaque (ex.: "3x mais rápido") na cor da marca abaixo
   Tom:       Alta autoridade, estilo newsletter
   Melhor para: LinkedIn, cabeçalhos do Substack
   Justificativa: A afirmação central do artigo ("X supera Y em 3x") é específica
              o suficiente para ancorar o visual — os leitores param em dados.

2. OBJETO CONCEITUAL
   Layout:    Ilustração de objeto central (ex.: um relógio quebrado para um artigo sobre perda de tempo),
              título no terço superior, fundo de textura mínima
   Tom:       Editorial, estilo Medium
   Melhor para: Cabeçalho de blog, capa do Medium, preheader de email
   Justificativa: Oferece flexibilidade de metáfora visual para diretores de arte; funciona em vários tamanhos.

3. DIVISÃO DE CONTRASTE
   Layout:    Metade esquerda na cor da marca, metade direita branca ou imagem,
              título no lado da cor, subtítulo de apoio no lado branco
   Tom:       Limpo, profissional, sensação de startup
   Melhor para: Newsletter, primeiro slide do carrossel do LinkedIn
   Justificativa: Layout dividido tem desempenho consistente em testes A/B de newsletters;
              o texto é legível em tamanhos pequenos.

4. APENAS TIPOGRÁFICO
   Layout:    Sem ilustração, tratamento de título ampliado,
              nome do autor em versalete na parte inferior, separador de linha fina
   Tom:       Premium, confiante, editorial
   Melhor para: Substack, Ghost, listas de email de alta densidade
   Justificativa: Funciona quando a marca tem uma identidade tipográfica forte. Mais rápido de produzir.

Quais composições você deseja que sejam geradas? (Responda com números, ex.: "1, 3" ou "todos")

Fase 2 — Arquivos de Imagem Gerados

Após a geração, o Claude salva os arquivos em ./thumbnails/[slug-do-artigo]/:

thumbnails/
└── slug-do-artigo-do-titulo/
    ├── candidate_01_afirmacao_impactante.png
    ├── candidate_02_objeto_conceitual.png
    ├── candidate_03_divisao_contraste.png
    ├── candidate_04_tipografico.png
    └── evaluation_report.md

Fase 3 — Tabela Resumo de Avaliação

O Claude avalia cada imagem retornada via visão computacional e produz:

Avaliação de Miniatura — "[Título do Artigo]"
Gerada: 2026-05-27  |  Modelo: Gemini Imagen  |  Dimensões: 1792x1024

| # | Candidato | Composição | Adequação à Marca /10 | Legibilidade do Texto /10 | Recomendação |
|---|---|---|---|---|---|
| 1 | candidate_01_afirmacao_impactante.png | Afirmação Impactante | 9 | 8 | ★ Melhor escolha — âncora de dados forte, cores da marca corretas, título legível a 200px de largura |
| 2 | candidate_02_objeto_conceitual.png | Objeto Conceitual | 7 | 9 | Boa alternativa — legível, limpo, mas o estilo de ilustração desviou ligeiramente da marca |
| 3 | candidate_03_divisao_contraste.png | Divisão de Contraste | 8 | 7 | Funciona bem em tamanho real; testar em tamanho de miniatura antes de publicar — o texto do lado direito aperta |
| 4 | candidate_04_tipografico.png | Apenas Tipográfico | 9 | 10 | Mais forte para email — risco zero de desvio da marca, totalmente baseado em texto |

Recomendado para web:          candidate_01_afirmacao_impactante.png
Recomendado para email/mobile: candidate_04_tipografico.png
Recomendado para redes sociais: candidate_03_divisao_contraste.png

Arquivos salvos em: ./thumbnails/slug-do-artigo-do-titulo/

Como o Claude Deve Executar Esta Habilidade

Passo 1 — Ingerir e analisar o artigo

Aceite o texto do artigo como texto colado ou uma URL.

Se uma URL for fornecida, busque a página e extraia:

  • O título H1
  • Os primeiros 3 a 5 parágrafos (o gancho, a afirmação central e os pontos-chave)
  • Quaisquer estatísticas notáveis ou estruturas nomeadas mencionadas
  • O nome do autor (para composições tipográficas)

Se o texto for colado, leia-o diretamente. Concentre-se em:

  • O gancho: Qual é a afirmação ou tensão inicial?
  • A tese central: Qual é a única coisa que o artigo argumenta ou ensina?
  • Detalhes específicos: Quaisquer números, estruturas nomeadas ou exemplos concretos que possam ancorar um visual
  • Tom: É formal/autoritário, conversacional/acessível, provocativo/desafiador?

Resuma essas descobertas internamente antes de propor composições — as propostas devem parecer adaptadas a este artigo específico, não genéricas.

Passo 2 — Coletar especificações da marca

Pergunte ao usuário pelas especificações da marca, se não fornecidas:

Para gerar miniaturas alinhadas à marca, preciso de alguns detalhes:

1. Cores da marca (códigos hexadecimais ou descrições) — ex.: #1A1A2E, #E94560
2. Preferência de estilo de fonte — ex.: "sans-serif negrito", "serif editorial", "geométrico"
3. Estilo visual — ex.: "plano minimalista", "fotorrealista", "ilustrado", "apenas tipográfico"
4. Referências de estilo — descreva uma marca ou publicação cuja estética você deseja igualar,
   ou compartilhe uma URL de imagem

Se você ainda não tem especificações de marca, diga "use padrões limpos" e usarei um estilo
editorial profissional escuro sobre branco.

Se o usuário disser "use padrões limpos", aplique:

  • Fundo: #FFFFFF ou #0F0F0F (padrão modo escuro)
  • Destaque: #2563EB (azul)
  • Estilo de fonte: sans-serif geométrico negrito
  • Estilo: plano minimalista, sem texturas, alto contraste

Passo 3 — Propor conceitos de composição

Escreva de 3 a 4 conceitos de composição adaptados ao tom e conteúdo do artigo. Cada conceito deve:

  • Ter um nome (rótulo curto e memorável)
  • Descrever o layout com precisão (onde o título vai, qual elemento visual o ancora, tratamento do fundo)
  • Observar o tom e o caso de uso para o qual é mais adequado
  • Incluir uma frase de justificativa explicando por que esta composição se encaixa neste artigo específico

Após apresentar os conceitos, pergunte quais gerar. Aguarde a confirmação do usuário antes de fazer qualquer chamada de API.

Passo 4 — Escrever prompts de geração de imagem do Gemini

Para cada composição selecionada, escreva um prompt de geração de imagem detalhado. Prompts de geração de imagem seguem uma gramática diferente de prompts de texto — eles são descritivos, não instrutivos.

Estrutura do prompt:

[Assunto/composição] + [Estilo] + [Paleta de cores] + [Tom/iluminação] +
[Tratamento de texto, se houver] + [O que evitar]

Exemplo de prompt para composição de Afirmação Impactante:

Imagem de miniatura de artigo. Título grande em negrito branco sans-serif "3x Mais Rápido Que
Métodos Tradicionais" centralizado em um fundo azul marinho escuro (#1A1A2E). Pequeno texto de destaque
coral (#E94560) abaixo lendo o subtítulo. Design plano minimalista, sem gradientes, sem elementos de banco
 de imagens, sem pessoas. Estilo editorial profissional limpo, alto contraste, formato de cabeçalho de
newsletter, orientação paisagem 16:9. A composição é tipográfica — o texto é o herói,
sem ilustração necessária. Evitar: clip art, sombras projetadas, baixo contraste, layout poluído.

Regras do prompt:

  • Inclua códigos hexadecimais exatos quando as cores da marca forem fornecidas
  • Especifique o texto exato do título a aparecer na imagem
  • Nomeie o estilo explicitamente ("design plano", "editorial", "fotorrealista") — o Gemini responde bem a nomes de categorias de estilo
  • Adicione um prompt negativo ("Evitar: ...") no final para reduzir desvios do estilo da marca
  • Mantenha os prompts com menos de 300 palavras — prompts mais longos não produzem resultados melhores de forma confiável

Passo 5 — Verificar pré-requisitos e executar o script de geração

Antes de chamar a API, verifique:

# Verificar se a chave da API está definida
echo $GEMINI_API_KEY

# Verificar se o script existe
ls -la ./generate_image.py

# Verificar dependências
python3 -c "import google.generativeai, PIL, requests; print('Dependências OK')"

Se o script estiver faltando, ofereça-se para criá-lo usando o modelo na seção Modelo de Script abaixo.

Execute o script de geração para cada prompt:

python3 generate_image.py \
  --prompt "seu prompt completo aqui" \
  --output "./thumbnails/slug-do-artigo/candidate_01_afirmacao_impactante.png" \
  --width 1792 \
  --height 1024

Ou passe todos os prompts em um arquivo de configuração em lote:

python3 generate_image.py --config ./thumbnails/slug-do-artigo/prompts.json

Passo 6 — Avaliar imagens geradas

Após cada imagem ser salva, examine-a usando visão computacional. Avalie em duas dimensões:

Adequação à Marca (pontuação /10):

  • As cores da marca estão corretas? (1-2 pontos cada)
  • O estilo corresponde à estética solicitada? (2 pontos)
  • O layout é consistente com o resumo da composição? (2 pontos)
  • Existem artefatos de IA, texto distorcido ou elementos não intencionais? (-1 por problema)

**Legibilidade do Texto (pontuação /10):

  • O título é legível na resolução máxima? (3 pontos)
  • O título é legível quando a imagem é redimensionada para 300px de largura (tamanho de miniatura)? (3 pontos)
  • Há contraste suficiente entre o texto e o fundo? (2 pontos)
  • O texto está posicionado dentro de zonas seguras (sem cortes nas bordas)? (2 pontos)

Nota: O Gemini Imagen às vezes renderiza texto com erros ortográficos ou formas de letras distorcidas. Se isso acontecer, observe na avaliação e sugira que o usuário adicione a sobreposição de texto manualmente no Canva ou Figma.

Passo 7 — Produzir o relatório de avaliação

Escreva a tabela resumo de avaliação (formato mostrado na seção Estrutura de Saída) e salve-a como evaluation_report.md na pasta de saída.

Inclua:

  • Justificativa de uma linha para cada pontuação
  • Uma recomendação de melhor escolha por caso de uso (web, email/mobile, redes sociais)
  • Quaisquer observações de produção (ex.: "a renderização de texto está imperfeita no candidate_02 — sobreponha o texto manualmente")
  • Os prompts completos usados, para que o usuário possa iterar diretamente no AI Studio, se necessário

Passo 8 — Oferecer iteração

Após entregar os candidatos, ofereça uma rodada de iteração:

Quer iterar em algum destes?

Opções:
- Ajustar cores ou estilo de um candidato específico
- Tentar um conceito de composição diferente
- Alterar o texto do título
- Reexecutar com parâmetros diferentes do Gemini (temperatura/seed diferentes)
- Gerar variantes adicionais da melhor escolha

Apenas me diga o que mudar.

Modelo de Script

O Claude deve se oferecer para escrever este arquivo se generate_image.py não estiver presente. Este é o modelo canônico a ser usado.

#!/usr/bin/env python3
"""
generate_image.py — Wrapper do Gemini Imagen para a habilidade Thumbnail Creator.

Uso:
    python3 generate_image.py --prompt "..." --output "./out.png" [--width 1792] [--height 1024]
    python3 generate_image.py --config ./prompts.json

Formato do JSON de configuração:
    [
      {
        "prompt": "...",
        "output": "./thumbnails/slug/candidate_01.png",
        "width": 1792,
        "height": 1024
      }
    ]

Requisitos:
    pip install google-generativeai Pillow
"""

import os
import sys
import json
import argparse
import base64
from pathlib import Path

try:
    import google.generativeai as genai
    from google.generativeai import types as genai_types
except ImportError:
    print("ERRO: google-generativeai não instalado. Execute: pip install google-generativeai")
    sys.exit(1)

try:
    from PIL import Image
    import io
except ImportError:
    print("ERRO: Pillow não instalado. Execute: pip install Pillow")
    sys.exit(1)


def get_api_key() -> str:
    key = os.environ.get("GEMINI_API_KEY", "")
    if not key:
        print("ERRO: A variável de ambiente GEMINI_API_KEY não está definida.")
        print("Obtenha uma chave em: https://aistudio.google.com/app/apikey")
        print("Em seguida, execute: export GEMINI_API_KEY=<sua-chave>")
        sys.exit(1)
    return key


def generate_image(
    prompt: str,
    output_path: str,
    width: int = 1792,
    height: int = 1024,
) -> bool:
    """
    Chama o Gemini Imagen para gerar uma única imagem e salva em output_path.
    Retorna True se bem-sucedido, False caso contrário.
    """
    path = Path(output_path)
    path.parent.mkdir(parents=True, exist_ok=True)

    api_key = get_api_key()
    genai.configure(api_key=api_key)

    model = genai.GenerativeModel(
        model_name="models/imagen-3.0-generate-001",
        generation_config=genai_types.GenerationConfig(
            temperature=1.0,
        ),
    )

    try:
        response = model.generate_content(
            prompt,
            generation_config=genai_types.GenerationConfig(
                candidate_count=1,
            ),
        )
        
        if not response.candidates:
            print(f"ERRO: Nenhum candidato retornado para o prompt.")
            return False

        # Gemini retorna dados de imagem no primeiro candidate
        candidate = response.candidates[0]
        if not candidate.content or not candidate.content.parts:
            print(f"ERRO: Candidato vazio para o prompt.")
            return False

        # A primeira parte deve conter dados de imagem
        part = candidate.content.parts[0]
        if not part.inline_data or not part.inline_data.data:
            print(f"ERRO: Nenhum dado de imagem na resposta.")
            return False

        # Decodificar base64 e salvar
        image_data = base64.b64decode(part.inline_data.data)
        image = Image.open(io.BytesIO(image_data))
        image.save(path)
        print(f"Imagem gerada e salva em: {path}")
        return True

    except Exception as e:
        print(f"ERRO ao gerar imagem: {e}")
        return False


def batch_generate(config_path: str) -> None:
    """
    Gera imagens a partir de um arquivo de configuração JSON.
    """
    with open(config_path, "r") as f:
        prompts = json.load(f)

    success_count = 0
    total = len(prompts)

    for i, item in enumerate(prompts, 1):
        print(f"\n--- Gerando imagem {i}/{total} ---")
        success = generate_image(
            prompt=item["prompt"],
            output_path=item["output"],
            width=item.get("width", 1792),
            height=item.get("height", 1024),
        )
        if success:
            success_count += 1

    print(f"\nConcluído. {success_count}/{total} imagens geradas com sucesso.")


def main():
    parser = argparse.ArgumentParser(description="Gerar imagem via Gemini Imagen")
    parser.add_argument("--prompt", type=str, help="Prompt de texto para geração da imagem")
    parser.add_argument("--output", type=str, help="Caminho para salvar a imagem de saída")
    parser.add_argument("--width", type=int, default=1792, help="Largura da imagem (padrão: 1792)")
    parser.add_argument("--height", type=int, default=1024, help="Altura da imagem (padrão: 1024)")
    parser.add_argument("--config", type=str, help="Caminho para arquivo de configuração JSON com múltiplos prompts")

    args = parser.parse_args()

    if args.config:
        batch_generate(args.config)
    elif args.prompt and args.output:
        generate_image(
            prompt=args.prompt,
            output_path=args.output,
            width=args.width,
            height=args.height,
        )
    else:
        parser.print_help()
        sys.exit(1)


if __name__ == "__main__":
    main()

Notas Finais

  • Limites de velocidade: A API Gemini Imagen tem limites de taxa. Se você estiver gerando várias imagens de uma vez, o script as processará em série para evitar erros de limitação de taxa.
  • Precisão do texto: O Gemini Imagen, como outros modelos de IA, às vezes pode renderizar texto com erros ortográficos ou distorções. Sempre verifique os resultados e, se a precisão do texto for crítica, considere sobrepor o texto manualmente.
  • Custo: A API Gemini Imagen oferece um nível gratuito generoso. Para uso em produção, consulte os preços mais recentes na documentação do Google AI Studio.
  • Direitos de uso: As imagens geradas são de sua propriedade, sujeitas aos termos de serviço do Google.

Individual skills in this repo

This repo contains 8 individual skills — each has its own dedicated page.

mohitagw15856/pm-claude-skills

Create a structured brief for an influencer or creator partnership campaign. Use when asked to brief an influencer, plan a creator collaboration, set up a paid partnership, or define deliverables for a sponsored content campaign. Produces a complete campaign brief with objectives, deliverables, creative guidelines, approval process, and performance metrics.

mohitagw15856/pm-claude-skills

Write full landing-page copy that converts — section by section. Use when asked to write a landing page, homepage copy, a product page, or copy for a marketing site. Produces complete copy for every section (hero, problem, solution, social proof, features-as-benefits, objections/FAQ, final CTA) with a clear single conversion goal and one primary call to action.

mohitagw15856/pm-claude-skills

Write a short-form video script for TikTok, Instagram Reels, or YouTube Shorts — built on the hook→retention→payoff structure that drives watch-time. Use when asked to script a Reel, TikTok, Short, or any 15–60s vertical video. Produces a timed script with a 0–3s hook, retention beats with on-screen text and B-roll cues, a payoff, and a CTA — plus a caption and on-screen-text list. Distinct from long-form YouTube scripting.

mohitagw15856/pm-claude-skills

Plan and write a paid social advertising campaign. Use when asked to build a paid social campaign, create Meta/LinkedIn/TikTok/X ad copy, define a social ad strategy, or plan an advertising funnel across social platforms. Produces a complete campaign plan with audience targeting, ad set structure, copy for each ad format, budget allocation, and measurement framework.

mohitagw15856/pm-claude-skills

Build a framework for creating shareable, high-reach social media content. Use when asked to plan viral content, develop a shareable content strategy, create a hook writing system, or build a repeatable process for content that gets shared. Produces a platform-specific viral content framework with hook formulas, content structures, shareability triggers, and a content testing system.

mohitagw15856/pm-claude-skills

Build boolean and X-ray search strings to source candidates. Use when asked to build a boolean search, source candidates on LinkedIn/Google, write an X-ray search, or find people with specific skills. Produces ready-to-paste boolean strings (with synonyms, must-haves, and exclusions), X-ray variants for LinkedIn/GitHub, and a refinement plan to widen or narrow the result set.

mohitagw15856/pm-claude-skills

Write pricing page copy that helps buyers self-select the right plan and convert. Use when asked to write or improve a pricing page, name and describe pricing tiers, write plan feature lists, pricing CTAs, or a pricing FAQ. Produces complete pricing page copy — a header, tier cards with names, prices, audiences, feature lists, CTAs, an add-on/enterprise section, and an objection-handling FAQ.

mohitagw15856/pm-claude-skills

Audit an existing social media presence across all active platforms. Use when asked to review social media performance, analyse a brand's social presence, benchmark against competitors, or identify what's working and what isn't. Produces a scored audit with platform-by-platform analysis, content performance review, competitive benchmarking, and a prioritised action plan.

Habilidades Relacionadas