CommunityImagengithub.com

mohitagw15856/thumbnail-creator

Genera candidatos para miniaturas de artículos o newsletters utilizando la API de Gemini desde Claude Code. Claude lee el texto, propone conceptos de composición, escribe prompts de generación de imágenes con especificaciones de marca, llama a Gemini, evalúa los resultados mediante visión por computadora y devuelve candidatos clasificados con justificación.

¿Qué es thumbnail-creator?

Thumbnail Creator es una habilidad para Claude Code que automatiza completamente la creación de miniaturas para artículos y newsletters usando la API de Gemini. En lugar de cambiar entre herramientas o usar la interfaz web de Gemini imagen por imagen, esta habilidad permite que Claude realice todo el proceso: leer el texto del artículo, proponer conceptos de composición adaptados al tono y contenido, escribir prompts detallados de generación de imágenes que incorporan colores de marca, fuentes y referencias de estilo, llamar a la API de Gemini (Imagen) para generar las imágenes, evaluar visualmente los resultados con visión por computadora, y devolver una tabla clasificada de candidatos con puntuaciones y recomendaciones. La habilidad es útil para creadores de contenido, editores y especialistas en marketing que necesitan miniaturas profesionales y coherentes con la marca sin salir del entorno de desarrollo. Soporta la generación por lotes de hasta 8 candidatos, formatos de salida estándar (16:9, cuadrado, vertical) y almacenamiento organizado por artículo. El resultado final son archivos PNG listos para usar directamente en un CMS o herramienta de newsletter.

Compatible con✓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 Imagen skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Habilidad Creador de Miniaturas (vía Gemini)

Genera candidatos para miniaturas de artículos y newsletters actuando como un agente de generación de imágenes dentro de Claude Code. En lugar de cambiar entre herramientas y usar la interfaz web de Gemini una imagen a la vez, esta habilidad hace que Claude realice el ciclo completo: leer el texto, proponer composiciones, escribir prompts adaptados, llamar a la API de Gemini, evaluar los resultados y devolver resultados clasificados con una breve justificación.

El resultado son candidatos de miniatura listos para producción que puedes insertar directamente en tu CMS, herramienta de newsletter o programador de redes sociales.


Requisitos Previos

Ambos deben estar en su lugar antes de que la habilidad pueda generar imágenes:

1. Clave API de Gemini

Obtén una clave gratuita en Google AI Studio.

Establécela como variable de entorno:

export GEMINI_API_KEY=<tu-clave>

Para mantenerla entre sesiones, agrégala a tu perfil de shell (~/.zshrc o ~/.bashrc):

echo 'export GEMINI_API_KEY=<tu-clave>' >> ~/.zshrc
source ~/.zshrc

Verifica que esté configurada:

echo $GEMINI_API_KEY

2. Script generate_image.py

Este script debe existir en ./generate_image.py en la raíz del proyecto. La plantilla completa está en la sección Plantilla del Script a continuación. Claude lo verificará y se ofrecerá a crearlo si falta.

Dependencias de Python:

pip install google-generativeai Pillow requests

O con uv:

uv pip install google-generativeai Pillow requests

Entradas Requeridas

Claude solicitará estos datos si no se proporcionan:

EntradaRequeridaNotas
Texto del artículo o URLSíPega el texto completo del artículo o proporciona una URL para obtenerlo. Se usa para extraer temas, ganchos y puntos clave para la composición.
Colores de marcaRecomendadoCódigos hexadecimales o nombres descriptivos. Ej. #1A1A2E (azul marino), #E94560 (coral). Si no se proporcionan, Claude usa valores neutros predeterminados limpios.
Fuentes / estilo tipográficoRecomendadoEj. "sans-serif negrita", "serif editorial", "Neue Haas Grotesk". Se usa en el prompt para guiar el tratamiento del texto.
Descripción de referencia de estiloRecomendadoEj. "ilustración plana, minimalista, como el sitio de marketing de Stripe" o "fotorrealista, fondo oscuro, alto contraste". También se puede proporcionar una URL de imagen de estilo.
Dimensiones de salidaNoPredeterminado: 1792x1024 (apaisado, miniatura de artículo estándar). Opciones: 1024x1024 (cuadrado), 1024x1792 (retrato/móvil).
Número de candidatosNoPredeterminado: 4. Mínimo 1, máximo 8 (límites de API y coste).
Título del artículo (si es diferente del H1)NoSe usa como elemento de texto principal en los prompts de imágenes.
Selección de candidatosNoDespués de proponer composiciones, Claude pregunta cuáles generar. El usuario puede decir "todos" o elegir por número.

Estructura de Salida

Fase 1 — Propuestas de Composición (texto, antes de cualquier llamada a la API)

Claude presenta 3-4 conceptos de composición para aprobación del usuario. Formato:

Conceptos de Composición para: "[Título del Artículo]"

1. AFIRMACIÓN AUDÁZ
   Diseño:     Fondo oscuro a sangre, título grande blanco centrado,
               un solo dato de acento (ej. "3x más rápido") en color de marca debajo
   Ambiente:   Alta autoridad, estilo newsletter
   Ideal para: LinkedIn, encabezados de Substack
   Justificación: La afirmación central del artículo ("X supera a Y por 3x") es lo suficientemente
                  específica como para anclar el visual: los lectores se detienen en los datos.

2. OBJETO CONCEPTUAL
   Diseño:     Ilustración central de objeto (ej. un reloj roto para un artículo sobre pérdida de tiempo),
               título en el tercio superior, fondo de textura mínima
   Ambiente:   Editorial, estilo Medium
   Ideal para: Encabezado de blog, portada de Medium, preencabezado de correo
   Justificación: Da flexibilidad de metáfora visual a los directores de arte; funciona en todos los tamaños.

3. DIVISIÓN DE CONTRASTE
   Diseño:     Mitad izquierda color de marca, mitad derecha blanca o con imagen,
               título en el lado de color, texto secundario en el lado blanco
   Ambiente:   Limpio, profesional, sensación de marca startup
   Ideal para: Newsletter, primera diapositiva de carrusel de LinkedIn
   Justificación: El diseño dividido funciona consistentemente en pruebas A/B de newsletters;
                  el texto es legible en tamaños pequeños.

4. SOLO TIPOGRÁFICO
   Diseño:     Sin ilustración, tratamiento de título sobredimensionado,
               nombre del autor en mayúsculas pequeñas en la parte inferior, separador de regla fina
   Ambiente:   Premium, seguro, editorial
   Ideal para: Substack, Ghost, listas de correo de alta densidad
   Justificación: Funciona cuando la marca tiene una identidad tipográfica fuerte. El más rápido de producir.

¿Qué composiciones deseas que se generen? (Responde con números, ej. "1, 3" o "todos")

Fase 2 — Archivos de Imagen Generados

Después de la generación, Claude guarda los archivos en ./thumbnails/[slug-del-artículo]/:

thumbnails/
└── slug-del-artículo-desde-el-título/
    ├── candidate_01_afirmacion_audaz.png
    ├── candidate_02_objeto_conceptual.png
    ├── candidate_03_division_contraste.png
    ├── candidate_04_tipografico.png
    └── evaluation_report.md

Fase 3 — Tabla Resumen de Evaluación

Claude evalúa cada imagen devuelta mediante visión por computadora y produce:

Evaluación de Miniatura — "[Título del Artículo]"
Generado: 2026-05-27  |  Modelo: Gemini Imagen  |  Dimensiones: 1792x1024

| # | Candidato | Composición | Ajuste a Marca /10 | Legibilidad de Texto /10 | Recomendación |
|---|---|---|---|---|---|
| 1 | candidate_01_afirmacion_audaz.png | Afirmación Audaz | 9 | 8 | ★ Mejor opción — ancla de datos sólida, colores de marca correctos, título legible a 200 px de ancho |
| 2 | candidate_02_objeto_conceptual.png | Objeto Conceptual | 7 | 9 | Buen respaldo — legible, limpio, pero el estilo de ilustración se desvió ligeramente de la marca |
| 3 | candidate_03_division_contraste.png | División de Contraste | 8 | 7 | Funciona bien a tamaño completo; probar a tamaño de miniatura antes de publicar — el texto del lado derecho se aprieta |
| 4 | candidate_04_tipografico.png | Tipográfico | 9 | 10 | El más fuerte para correo — riesgo cero de desviación de marca, completamente basado en texto |

Recomendado para web:          candidate_01_afirmacion_audaz.png
Recomendado para correo/móvil: candidate_04_tipografico.png
Recomendado para redes:       candidate_03_division_contraste.png

Archivos guardados en: ./thumbnails/slug-del-artículo-desde-el-título/

Cómo Debe Ejecutar Claude Esta Habilidad

Paso 1 — Ingerir y analizar el artículo

Aceptar el texto del artículo como texto pegado o una URL.

Si se proporciona una URL, obtener la página y extraer:

  • El título H1
  • Los primeros 3-5 párrafos (el gancho, la afirmación central y los puntos clave)
  • Cualquier estadística notable o marcos nombrados mencionados
  • El nombre del autor (para composiciones tipográficas)

Si se pega texto, leerlo directamente. Centrarse en:

  • El gancho: ¿Cuál es la afirmación inicial o la tensión?
  • La tesis central: ¿Cuál es la única cosa que el artículo argumenta o enseña?
  • Detalles clave: Cualquier número, marco nombrado o ejemplo concreto que pueda anclar un visual
  • Tono: ¿Es formal/autoritario, conversacional/accesible, provocador/basado en desafíos?

Resumir estos hallazgos internamente antes de proponer composiciones: las propuestas deben sentirse adaptadas a este artículo específico, no genéricas.

Paso 2 — Recopilar especificaciones de marca

Preguntar al usuario por las especificaciones de marca si no se proporcionan:

Para generar miniaturas acordes a la marca, necesito algunos detalles:

1. Colores de marca (códigos hex o descripciones) — ej. #1A1A2E, #E94560
2. Preferencia de estilo de fuente — ej. "sans-serif negrita", "serif editorial", "geométrica"
3. Estilo visual — ej. "minimalista plano", "fotorrealista", "ilustrado", "solo tipográfico"
4. Referencias de estilo — describe una marca o publicación cuya estética quieras igualar,
   o comparte una URL de imagen

Si aún no tienes especificaciones de marca, di "usa valores predeterminados limpios" y usaré un estilo
editorial profesional oscuro-sobre-blanco.

Si el usuario dice "usa valores predeterminados limpios", aplicar:

  • Fondo: #FFFFFF o #0F0F0F (modo oscuro predeterminado)
  • Acento: #2563EB (azul)
  • Estilo de fuente: sans-serif geométrico negrita
  • Estilo: minimalista plano, sin texturas, alto contraste

Paso 3 — Proponer conceptos de composición

Escribir 3-4 conceptos de composición adaptados al tono y contenido del artículo. Cada concepto debe:

  • Tener un nombre (etiqueta corta y memorable)
  • Describir el diseño con precisión (dónde va el título, qué elemento visual lo ancla, tratamiento del fondo)
  • Indicar el ambiente y el caso de uso para el que es más adecuado
  • Incluir una frase de justificación que explique por qué esta composición se ajusta a este artículo específico

Después de presentar los conceptos, preguntar cuáles generar. Esperar la confirmación del usuario antes de realizar cualquier llamada a la API.

Paso 4 — Escribir prompts de generación de imágenes de Gemini

Para cada composición seleccionada, escribir un prompt de generación de imágenes detallado. Los prompts de generación de imágenes siguen una gramática diferente a los prompts de texto: son descriptivos, no instructivos.

Estructura del prompt:

[Sujeto/composición] + [Estilo] + [Paleta de colores] + [Ambiente/iluminación] +
[Tratamiento del texto si lo hay] + [Qué evitar]

Ejemplo de prompt para composición Afirmación Audaz:

Imagen de miniatura de artículo. Texto de título grande y blanco en sans-serif negrita que dice "3x Más Rápido Que
Los Métodos Tradicionales" centrado sobre un fondo azul marino oscuro (#1A1A2E). Pequeño texto de acento coral
(#E94560) debajo leyendo el subtítulo. Diseño plano minimalista, sin degradados, sin elementos de stock,
sin personas. Estilo editorial profesional limpio, alto contraste, formato de encabezado de newsletter,
orientación apaisada 16:9. La composición es tipográfica — el texto es el héroe,
no se requiere ilustración. Evitar: clip art, sombras paralelas, bajo contraste, diseño abarrotado.

Reglas del prompt:

  • Incluir códigos hex exactos cuando se proporcionen colores de marca
  • Especificar el texto exacto del título que debe aparecer en la imagen
  • Nombrar el estilo explícitamente ("diseño plano", "editorial", "fotorrealista") — Gemini responde bien a los nombres de categorías de estilo
  • Agregar un prompt negativo ("Evitar: ...") al final para reducir la desviación del estilo de marca
  • Mantener los prompts por debajo de 300 palabras — los prompts más largos no producen resultados mejores de manera confiable

Paso 5 — Verificar requisitos previos y ejecutar el script de generación

Antes de llamar a la API, verificar:

# Verificar que la clave API esté configurada
echo $GEMINI_API_KEY

# Verificar que el script exista
ls -la ./generate_image.py

# Verificar dependencias
python3 -c "import google.generativeai, PIL, requests; print('Dependencias OK')"

Si el script falta, ofrecerse a crearlo usando la plantilla en la sección Plantilla del Script a continuación.

Ejecutar el script de generación para cada prompt:

python3 generate_image.py \
  --prompt "tu prompt completo aquí" \
  --output "./thumbnails/slug-del-artículo/candidate_01_afirmacion_audaz.png" \
  --width 1792 \
  --height 1024

O pasar todos los prompts en un archivo de configuración por lotes:

python3 generate_image.py --config ./thumbnails/slug-del-artículo/prompts.json

Paso 6 — Evaluar imágenes generadas

Después de que cada imagen se guarde, examinarla usando visión por computadora. Evaluar en dos dimensiones:

Ajuste a Marca (puntuación /10):

  • ¿Son correctos los colores de marca? (1-2 puntos cada uno)
  • ¿Coincide el estilo con la estética solicitada? (2 puntos)
  • ¿Es el diseño coherente con el resumen de composición? (2 puntos)
  • ¿Hay artefactos de IA, texto distorsionado o elementos no deseados? (-1 por problema)

Legibilidad del Texto (puntuación /10):

  • ¿Es legible el texto del título a resolución completa? (3 puntos)
  • ¿Es legible el texto del título cuando la imagen se escala a 300 px de ancho (tamaño de miniatura)? (3 puntos)
  • ¿Hay suficiente contraste entre el texto y el fondo? (2 puntos)
  • ¿Está la colocación del texto dentro de las zonas seguras (no cortado en los bordes)? (2 puntos)

Nota: Gemini Imagen a veces renderiza texto con errores ortográficos o formas de letras distorsionadas. Si esto ocurre, anotarlo en la evaluación y sugerir al usuario agregar la superposición de texto manualmente en Canva o Figma.

Paso 7 — Producir el informe de evaluación

Escribir la tabla resumen de evaluación (formato mostrado en la sección Estructura de Salida) y guardarla como evaluation_report.md en la carpeta de salida.

Incluir:

  • Una justificación de una línea para cada puntuación
  • Una recomendación de mejor opción por caso de uso (web, correo/móvil, redes sociales)
  • Cualquier nota de producción (ej. "la representación del texto es imperfecta en candidate_02 — superponer texto manualmente")
  • Los prompts completos utilizados, para que el usuario pueda iterar directamente en AI Studio si es necesario

Paso 8 — Ofrecer iteración

Después de entregar los candidatos, ofrecer una ronda de iteración:

¿Quieres iterar sobre alguno de estos?

Opciones:
- Ajustar colores o estilo en un candidato específico
- Probar un concepto de composición diferente
- Cambiar el texto del título
- Re-ejecutar con diferentes parámetros de Gemini (temperatura/semilla diferente)
- Generar variantes adicionales de la mejor opción

Solo dime qué cambiar.

Plantilla del Script

Claude debe ofrecerse a escribir este archivo si generate_image.py no está presente. Esta es la plantilla canónica a usar.

#!/usr/bin/env python3
"""
generate_image.py — Envoltorio de Gemini Imagen para la habilidad Creador de Miniaturas.

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

Formato JSON de configuración:
    [
      {
        "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("ERROR: google-generativeai no está instalado. Ejecuta: pip install google-generativeai")
    sys.exit(1)

try:
    from PIL import Image
    import io
except ImportError:
    print("ERROR: Pillow no está instalado. Ejecuta: pip install Pillow")
    sys.exit(1)


def get_api_key() -> str:
    key = os.environ.get("GEMINI_API_KEY", "")
    if not key:
        print("ERROR: La variable de entorno GEMINI_API_KEY no está configurada.")
        print("Obtén una clave en: https://aistudio.google.com/app/apikey")
        print("Luego ejecuta: export GEMINI_API_KEY=<tu-clave>")
        sys.exit(1)
    return key


def generate_image(
    prompt: str,
    output_path: str,
    width: int = 1792,
    height: int = 1024,
) -> bool:
    """
    Llama a Gemini Imagen para generar una sola imagen y guardarla en output_path.
    Retorna Verdadero si tiene éxito, Falso en caso contrario.
    """
    try:
        api_key = get_api_key()
        genai.configure(api_key=api_key)

        model = genai.GenerativeModel(
            model_name="models/imagen-3.0-generate-001"
        )

        response = model.generate_content(
            prompt,
            generation_config=genai_types.GenerationConfig(
                temperature=1.0,
            ),
        )

        if not response.candidates:
            print(f"ERROR: No se generaron candidatos para el prompt: {prompt[:50]}...")
            return False

        image_data = response.candidates[0].content.parts[0].inline_data.data
        Image.open(io.BytesIO(image_data)).save(output_path)
        print(f"Imagen guardada en: {output_path}")
        return True

    except Exception as e:
        print(f"ERROR al generar imagen: {e}")
        return False


def main():
    parser = argparse.ArgumentParser(
        description="Genera imágenes usando Gemini Imagen"
    )
    parser.add_argument(
        "--prompt",
        type=str,
        help="El prompt de texto para generar la imagen.",
    )
    parser.add_argument(
        "--output",
        type=str,
        help="Ruta del archivo de salida para la imagen (ej. ./out.png, ./thumbnails/slug/img.png).",
    )
    parser.add_argument(
        "--width",
        type=int,
        default=1792,
        help="Ancho de la imagen en píxeles (predeterminado: 1792).",
    )
    parser.add_argument(
        "--height",
        type=int,
        default=1024,
        help="Altura de la imagen en píxeles (predeterminado: 1024).",
    )
    parser.add_argument(
        "--config",
        type=str,
        help="Ruta a un archivo JSON con una lista de configuraciones de prompts.",
    )

    args = parser.parse_args()

    if args.config:
        with open(args.config, "r") as f:
            configs = json.load(f)
        for config in configs:
            generate_image(
                prompt=config["prompt"],
                output_path=config["output"],
                width=config.get("width", 1792),
                height=config.get("height", 1024),
            )
    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()

Consejos de Uso

  • Comienza con un artículo breve: Para tu primera prueba, pega un artículo de 500-800 palabras. Así verás el flujo completo sin esperar mucho tiempo de procesamiento.
  • Proporciona especificaciones de marca: Incluso un solo código de color de acento mejora significativamente la coherencia visual de los resultados.
  • Especifica el caso de uso: Dinos si las miniaturas son para Twitter/LinkedIn (cuadrado), YouTube (16:9) o la portada de un newsletter (16:9 vertical centrado). Las dimensiones predeterminadas son para artículos.
  • Revisa la legibilidad a tamaño reducido: Una miniatura que se ve bien a tamaño completo puede volverse ilegible cuando se reduce a 300 px. La evaluación de Claude verifica esto.
  • Itera en lotes: Si estás produciendo miniaturas para una serie, mantén los mismos colores y estilo de fuente en todos los artículos para que la serie parezcozca coherente.
  • Problemas con el texto: Gemini Imagen a veces genera texto con errores. Si esto ocurre, usar la superposición de texto manualmente en Canva es más rápido que re-generar.

Límites y Consideraciones

  • Límites de velocidad de API: La API de Gemini Imagen tiene límites de velocidad. Si generas más de 4 imágenes, puede haber una pausa de 10-15 segundos entre cada una.
  • Costes: La API gratuita tiene cuota diaria. Para trabajo de producción, Google Cloud proporciona niveles de pago.
  • Calidad de imagen: Gemini Imagen 3.0 maneja bien composiciones tipográficas y de diseño plano; el fotorrealismo con texto superpuesto a veces muestra artefactos, especialmente con fondos complejos.
  • Precisión del texto: La generación de texto dentro de imágenes sigue siendo un desafío para los modelos generativos. Las composiciones tipográficas pueden requerir retoques manuales para producción de alta calidad.
  • Atribución de estilo: Si proporcionas una URL de imagen de referencia de estilo, la usaremos como entrada. Ten en cuenta que es posible que la API no duplique exactamente el estilo; úsala como inspiración general, no como plantilla exacta.

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.

Skills relacionados