Communitygithub.com

Varnan-Tech/opendirectory

Proporciona la URL o descripción de tu producto y encuentra 5 competidores globales, extrae sus páginas de precios reales, obtiene todos los niveles y puntos de precio, y devuelve un informe completo de inteligencia de precios: el modelo de precios dominante en tu espacio, una tabla de referencia de precios, análisis de barreras de funciones, mapa de posicionamiento competitivo y una estrategia de precios recomendada concreta para tu producto. Úsalo cuando te pidan investigar precios de competidores, encontrar referencias de precios, decidir cómo fijar el precio de un producto, entender modelos de precios en un espacio o construir una estrategia de precios.

¿Qué es opendirectory?

Pricing Finder es una habilidad de agente de IA especializada en inteligencia competitiva de precios. Diseñada para agentes como Claude Code, Cursor y Codex, esta herramienta automatiza completamente el proceso de investigación de precios de la competencia: dado un producto (por URL o descripción), descubre 5 competidores relevantes a nivel global, extrae sus páginas de precios reales y genera un informe completo de inteligencia de precios. El informe incluye el modelo de precios dominante en el espacio, una tabla de referencia con niveles y precios, un análisis de barreras de funciones (qué características separan los niveles), un mapa de posicionamiento competitivo y una recomendación concreta de estrategia de precios para el producto del usuario. La habilidad opera bajo una estricta política de cero alucinaciones: cada punto de precio, nombre de nivel y barrera de función en la salida debe rastrearse directamente al contenido de la página de precios obtenida o a fragmentos de búsqueda de DuckDuckGo. No utiliza API keys obligatorias; se ejecuta completamente con dependencias gratuitas de pip (requests, BeautifulSoup4, html2text). Opcionalmente, se pueden configurar API keys de Tavily y Firecrawl para mejorar la calidad de búsqueda y la representación de páginas con JavaScript. Pricing Finder es ideal para startups, gerentes de producto y estrategas que necesitan tomar decisiones de precios basadas en datos reales del mercado, evitando suposiciones o sesgos de conocimiento de entrenamiento. El flujo incluye pasos de verificación humana, como la confirmación de la lista de competidores antes de la extracción de precios, y marca explícitamente la calidad de los datos (alta/media/baja) para que el usuario entienda la confianza en cada fuente.

Compatible con✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/Varnan-Tech/opendirectory/tree/main/skills/pricing-finder

Preguntar en tu IA favorita

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

Documentación

Pricing Finder

Proporciona la URL o descripción de tu producto. Encuentra 5 competidores, obtiene sus páginas de precios reales y devuelve un informe completo de inteligencia de precios: modelo dominante en tu espacio, tabla de referencia de precios, análisis de barreras de funciones, mapa de posicionamiento y una recomendación concreta de precios para tu producto.

No requiere API keys. Se ejecuta completamente con dependencias pip gratuitas. Las API keys opcionales mejoran la calidad.


Política de cero alucinaciones: Cada punto de precio, nombre de nivel y barrera de función en la salida debe rastrearse al contenido de la página de precios obtenida o a un fragmento de búsqueda de DuckDuckGo. Esto aplica a:

  • Precios de competidores: extraídos textualmente del contenido de la página obtenida únicamente.
  • "Contactar con ventas": registrado tal cual, nunca estimado ni reemplazado con un número.
  • Nombres de niveles: copiados exactamente de la página, no parafraseados.
  • Listas de funciones: extraídas del contenido de la página, no inferidas del conocimiento del producto.
  • Observaciones de posicionamiento: derivadas únicamente de los datos de la tabla de referencia.

Errores Comunes

El agente querrá...Por qué está mal
Rellenar "Contactar con ventas" con un precio estimadoNunca estimes el precio empresarial. Regístralo exactamente como "Contactar con ventas".
Usar conocimiento de entrenamiento para precios de competidoresCada precio debe rastrearse al contenido de la página obtenida o a un fragmento de búsqueda.
Saltar el paso de confirmación de competidoresMuestra siempre los competidores descubiertos y espera la confirmación. Competidores equivocados = referencias equivocadas.
Recomendar un precio sin hacer referencia a los datos de referenciaCada recomendación de precio debe citar un número específico de la tabla de referencia.
Marcar una página como de alta calidad cuando el contenido tiene < 500 caracteres< 500 caracteres significa que la página no se obtuvo -- marca data_quality como 'low' y usa el fragmento de búsqueda como respaldo.
Usar guiones largos en la salidaReemplaza todos los guiones largos por guiones cortos.

Leer Archivos de Referencia Antes de Cada Ejecución

cat references/pricing-models.md
cat references/extraction-guide.md
cat references/positioning-guide.md

Paso 1: Verificación de Configuración

echo "TAVILY_API_KEY:    ${TAVILY_API_KEY:+configurada (calidad de búsqueda mejorada)}${TAVILY_API_KEY:-no configurada, se usará DuckDuckGo (gratuito)}"
echo "FIRECRAWL_API_KEY: ${FIRECRAWL_API_KEY:+configurada (renderizado JS mejorado)}${FIRECRAWL_API_KEY:-no configurada, se usarán requests+BS4 (gratuitos)}"
echo ""
python3 -c "from ddgs import DDGS; import requests, bs4, html2text; print('Dependencias OK')" 2>/dev/null \
  || echo "ERROR: Faltan dependencias. Ejecuta: pip install ddgs requests beautifulsoup4 html2text"

Si faltan dependencias: Detente inmediatamente. Dile al usuario: "Faltan dependencias de Python. Ejecuta esto para instalarlas: pip install ddgs requests beautifulsoup4 html2text -- todo gratuito, no se necesitan cuentas. Luego inténtalo de nuevo."

Si solo faltan API keys: Continúa. DuckDuckGo y requests+BS4 son los valores predeterminados gratuitos.

Derivar slug del producto:

PRODUCT_SLUG=$(python3 -c "
from urllib.parse import urlparse
import sys, re
url = 'URL_AQUI'
if url.startswith('http'):
    host = urlparse(url).netloc.replace('www.', '')
    print(host.split('.')[0])
else:
    print(re.sub(r'[^a-z0-9]', '-', url[:30].lower()).strip('-'))
")
echo "Slug del producto: $PRODUCT_SLUG"

Paso 2: Analizar Entrada

Recopila de la conversación:

  • product_url: la URL a obtener (requerida, a menos que el usuario pegue directamente una descripción)
  • geography: opcional -- EE.UU. / Europa / India / global. Valor predeterminado: EE.UU.

Si el usuario proporciona solo una descripción pegada (sin URL): Omite los Pasos 3 y 4. Ve directamente al Paso 4 (análisis del producto) usando el texto pegado como product_content. Establece page_source como user_description y anota en data_quality_flags.

Si no hay URL ni descripción: Pregunta: "¿Cuál es la URL de tu producto o startup? O pega una breve descripción: qué hace, para quién es y qué lo hace diferente."


Paso 3: Obtener Página del Producto

Principal: Firecrawl (si FIRECRAWL_API_KEY está configurada)

curl -s -X POST https://api.firecrawl.dev/v1/scrape \
  -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "URL_AQUI", "formats": ["markdown"], "onlyMainContent": true}' \
  | python3 -c "
import sys, json
d = json.load(sys.stdin)
content = d.get('data', {}).get('markdown', '') or d.get('markdown', '')
print(f'Obtenido vía Firecrawl: {len(content)} caracteres')
open('/tmp/pf-product-raw.md', 'w').write(content)
"

Respaldo: requests + BS4 (gratuito, siempre disponible)

python3 << 'PYEOF'
import requests, html2text, random

USER_AGENTS = [
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
]
headers = {"User-Agent": random.choice(USER_AGENTS), "Accept": "text/html,application/xhtml+xml;q=0.9,*/*;q=0.8"}
resp = requests.get("URL_AQUI", headers=headers, timeout=20, allow_redirects=True)
converter = html2text.HTML2Text()
converter.ignore_images = True
converter.body_width = 0
content = converter.handle(resp.text)[:8000]
print(f'Obtenido vía requests+BS4: {len(content)} caracteres')
open('/tmp/pf-product-raw.md', 'w').write(content)
PYEOF

Punto de control:

python3 -c "
content = open('/tmp/pf-product-raw.md').read()
if len(content) < 200:
    print('ERROR: se obtuvieron menos de 200 caracteres -- la página puede estar renderizada con JS')
else:
    print(f'Contenido OK: {len(content)} caracteres')
"

Si el contenido tiene < 200 caracteres: Dile al usuario: "La página del producto devolvió muy poco contenido -- es posible que el sitio esté renderizado con JavaScript. Por favor, pega una breve descripción: qué hace tu producto, para quién es y qué lo hace diferente de los competidores."


Paso 4: Análisis del Producto (IA)

Imprimir el contenido de la página:

python3 -c "
content = open('/tmp/pf-product-raw.md').read()[:5000]
print('=== PÁGINA DEL PRODUCTO (primeros 5000 caracteres) ===')
print(content)
"

Instrucciones para la IA: Analiza la página del producto anterior y extrae:

  • product_name: el nombre del producto o empresa
  • one_line_description: qué hace, para quién, propuesta de valor principal. Menos de 20 palabras. Sin lenguaje de marketing.
  • industry_taxonomy: l1 (nivel superior: developer tools / fintech / healthtech / consumer / etc.), l2 (sector: devops / payments / hr / etc.), l3 (nicho específico: automatización CI/CD / pagos integrados / video asíncrono / etc.)
  • differentiators: exactamente 2-3 cosas específicas que distinguen este producto. Estos alimentan la recomendación -- sé específico. Respuestas genéricas como "fácil de usar" no son aceptables.
  • icp: buyer_persona (cargo), company_type, company_size
  • geography_bias: EE.UU. / Europa / India / global
  • page_source: "live_page" o "user_description"

Escribir en /tmp/pf-product-analysis.json:

python3 << 'PYEOF'
import json

analysis = {
    # COMPLETA con tu análisis anterior
    "product_name": "",
    "one_line_description": "",
    "industry_taxonomy": {"l1": "", "l2": "", "l3": ""},
    "differentiators": [],
    "icp": {"buyer_persona": "", "company_type": "", "company_size": ""},
    "geography_bias": "EE.UU.",
    "page_source": "live_page"
}

json.dump(analysis, open('/tmp/pf-product-analysis.json', 'w'), indent=2)
print('Análisis del producto escrito.')
PYEOF

Verificar:

python3 -c "
import json
a = json.load(open('/tmp/pf-product-analysis.json'))
print('Producto:', a['product_name'])
print('Industria:', a['industry_taxonomy']['l1'], '>', a['industry_taxonomy']['l2'], '>', a['industry_taxonomy']['l3'])
print('Diferenciadores:')
for d in a['differentiators']:
    print(f'  - {d}')
"

Paso 4b: Fase 1 -- Descubrimiento de Competidores

ls scripts/research.py 2>/dev/null && echo "script encontrado" || echo "ERROR: no se encontró scripts/research.py -- no se puede continuar"
python3 scripts/research.py \
  --phase discover \
  --product-analysis /tmp/pf-product-analysis.json \
  --output /tmp/pf-competitors-raw.json

Imprimir resultados para revisión por IA:

python3 -c "
import json
data = json.load(open('/tmp/pf-competitors-raw.json'))
print(f'Búsquedas ejecutadas: {len(data[\"competitor_searches\"])}')
for s in data['competitor_searches']:
    print(f'\nConsulta: {s[\"query\"]}')
    for r in s.get('results', [])[:6]:
        print(f'  - {r[\"title\"]} | {r[\"url\"]}')
        print(f'    {r.get(\"snippet\",\"\")[:150]}')
"

Instrucciones para la IA: Lee los resultados de búsqueda anteriores. Elige exactamente 5 empresas competidoras que:

  1. Estén nombradas en los títulos o fragmentos de los resultados de búsqueda
  2. Estén en el mismo nicho L3 que el producto que se está analizando
  3. Sean productos de software reales (no agencias, artículos de listas o sitios de reseñas)
  4. Sean distintas entre sí

Para cada competidor escribe: name, url, pricing_url (su página de precios -- infiere como [url]/pricing si no se encuentra en los fragmentos), description (una oración del fragmento), source_url.


Paso 5: Confirmación de Competidores

python3 << 'PYEOF'
import json

analysis = json.load(open('/tmp/pf-product-analysis.json'))

# COMPLETA: 5 competidores de los resultados de búsqueda anteriores
candidates = [
    # {"name": str, "url": str, "pricing_url": str, "description": str, "source_url": str}
]

print(f"\nSe encontraron 5 competidores para {analysis['product_name']} en {analysis['industry_taxonomy']['l3']}:\n")
for i, c in enumerate(candidates, 1):
    print(f"  {i}. {c['name']} -- {c['description']}")
    print(f"     Producto: {c['url']}")
    print(f"     Precios: {c['pricing_url']}")

data = json.load(open('/tmp/pf-competitors-raw.json'))
data['competitor_candidates'] = candidates
json.dump(data, open('/tmp/pf-competitors-raw.json', 'w'), indent=2)
PYEOF

Dile al usuario: "Estos son los 5 competidores de los que obtendré datos de precios. Agrega, elimina o cambia cualquiera -- o di 'se ve bien' para continuar."

Espera la confirmación. Si el usuario edita la lista, actualiza los candidatos en consecuencia. Luego escribe la lista confirmada:

python3 << 'PYEOF'
import json

# COMPLETA: lista de competidores confirmada (después de la revisión del usuario)
confirmed = [
    # {"name": str, "url": str, "pricing_url": str}
]

json.dump({"confirmed_competitors": confirmed}, open('/tmp/pf-competitors-confirmed.json', 'w'), indent=2)
print(f"Confirmados {len(confirmed)} competidores para la investigación de precios.")
for c in confirmed:
    print(f"  - {c['name']} | precios: {c['pricing_url']}")
PYEOF

Paso 6: Fase 2 -- Obtener Páginas de Precios

python3 scripts/research.py \
  --phase fetch-pricing \
  --competitors /tmp/pf-competitors-confirmed.json \
  --output /tmp/pf-pricing-raw.json

Esto obtiene la página de precios de cada competidor usando un respaldo de 3 niveles:

  1. Obtención directa: requests + beautifulsoup4 + html2text
  2. Caché de Google: webcache.googleusercontent.com/search?q=cache:[url]
  3. Búsqueda en DuckDuckGo: "[competidor]" planes de precios costo por mes (respaldo de fragmento)

Imprimir resumen de obtención:

python3 -c "
import json
data = json.load(open('/tmp/pf-pricing-raw.json'))
print(f'Competidores obtenidos: {data[\"competitors_fetched\"]}')
print()
for r in data['results']:
    quality_label = {'high': 'BUENO', 'medium': 'OK', 'low': 'SOLO FRAGMENTO'}.get(r['data_quality'], r['data_quality'])
    print(f'  {r[\"name\"]:20} {r[\"source\"]:15} {r[\"content_length\"]:5} caracteres  [{quality_label}]')
"

Si un competidor tiene data_quality: low: Esto significa que la página de precios fue bloqueada o está renderizada con JS. El análisis continuará usando fragmentos de búsqueda, pero la confianza para ese competidor se marcará como baja.


Paso 7: Extracción de Precios (IA)

Imprimir todo el contenido de precios sin procesar:

python3 -c "
import json
data = json.load(open('/tmp/pf-pricing-raw.json'))
for r in data['results']:
    print(f'\n=== {r[\"name\"]} (fuente: {r[\"source\"]}, calidad: {r[\"data_quality\"]}) ===')
    print(f'URL de precios: {r[\"pricing_url\"]}')
    print(r['content'][:4000])
    print('---')
"

Instrucciones para la IA: Para cada competidor, extrae datos de precios estructurados del contenido anterior. Sigue references/extraction-guide.md para saber cómo identificar niveles, precios, límites y CTAs.

Reglas de cero alucinaciones:

  1. Extrae precios textualmente solo del contenido. Si un precio no está en el contenido, escribe null.
  2. Registra "Contactar con ventas" exactamente tal cual. Nunca lo reemplaces con un número estimado.
  3. data_quality: low significa que los datos provienen de fragmentos de búsqueda -- extrae lo que hay pero no llenes vacíos con conocimiento de entrenamiento.
  4. Para cualquier campo no presente en el contenido: escribe "no encontrado en los datos de la página".
  5. Precios anuales: registra siempre el equivalente mensual junto con el total anual.

Escribir en /tmp/pf-pricing-extracted.json:

python3 << 'PYEOF'
import json

# COMPLETA: un objeto por competidor, siguiendo el esquema siguiente
extracted = [
    # {
    #   "competitor": str,
    #   "pricing_url": str,
    #   "data_quality": "high" | "medium" | "low",
    #   "pricing_model": "per-seat" | "flat-rate" | "usage-based" | "freemium" | "tiered-flat" | "hybrid",
    #   "billing_cadence": ["monthly"] | ["annual"] | ["monthly", "annual"],
    #   "annual_discount": str,           # ej. "20%" o "no encontrado en los datos de la página"
    #   "free_tier": true | false,
    #   "free_trial": true | false,
    #   "free_trial_days": int | null,
    #   "tiers": [
    #     {
    #       "name": str,
    #       "price_monthly": float | null,       # null si es Contactar con ventas
    #       "price_annual_monthly": float | null, # equivalente mensual cuando se factura anualmente
    #       "price_note": str,                   # "Contactar con ventas", "Gratis" o vacío
    #       "seats": str,                        # "por asiento", "ilimitado", "hasta 5", etc.
    #       "key_limits": [str],                 # almacenamiento, llamadas API, proyectos, etc.
    #       "key_features": [str]                # las 3-5 funciones principales en este nivel
    #     }
    #   ],
    #   "enterprise_tier": true | false,
    #   "enterprise_pricing": str,               # "Contactar con ventas" o precio real
    #   "regional_pricing": str | null           # ej. "India: ₹999/mes" o null
    # }
]

… [truncado para la traducción]

Paso 8: Generar Informe (IA)

Imprimir todos los datos estructurados:

python3 -c "
import json
data = json.load(open('/tmp/pf-pricing-extracted.json'))
print(json.dumps(data, indent=2))
"

Instrucciones para la IA: Con los datos estructurados de todos los 5 competidores, genera un informe completo de inteligencia de precios. Sigue references/pricing-models.md para clasificar los modelos de precios y references/positioning-guide.md para el análisis de posicionamiento.

El informe debe:

  1. Clasificar el modelo de precios dominante en tu espacio L3
  2. Tabla de referencia de precios: tabla markdown que muestre a todos los competidores, sus niveles, precios, límites y funciones principales
  3. Análisis de barreras de funciones: qué funciones separan los niveles (ej. usuarios, almacenamiento, integraciones, etc.)
  4. Mapa de posicionamiento: diagrama de matriz simple en markdown que ubique a cada competidor en ejes relevantes (precio vs. características, o simplicidad vs. potencia)
  5. Estrategia de precios recomendada: extraída directamente de los datos de referencia

Formato de salida:

# Inteligencia de Precios: [Nombre del Producto]

## Modelo de Precios Dominante
[1-2 oraciones sobre lo que la mayoría usa (por asiento, basado en uso, precio fijo)]

## Tabla de Referencia de Precios
| Competidor | Nivel | Precio/mes | Facturado Anualmente | Asientos | Límites Clave | Funciones Clave |
|---|---|---|---|---|---|---|
| ... | ... | ... | ... | ... | ... | ... |

## Análisis de Barreras de Funciones
[Qué funciones separan los niveles gratuitos vs. de pago, los niveles de gama baja vs. gama alta. Ej.: "El almacenamiento y los usuarios son las principales barreras: todos los competidores comienzan con 1-2 usuarios y 100 MB de almacenamiento en el nivel gratuito"]

## Mapa de Posicionamiento
[Matriz simple 2x2 en markdown que ubique a cada competidor. Ejes basados en los datos -- ej. Precio (bajo a alto) vs. Características (básico a rico)]

## Estrategia de Precios Recomendada
[Dada tu propuesta de valor única y la tabla de referencia, aquí está el precio de entrada recomendado, dónde establecer la barrera de funciones y qué modelo de precios usar. Cita números específicos de la tabla de referencia.]

Paso 9: Resumen

echo "=== INFORME DE INTELIGENCIA DE PRECIOS: $(python3 -c "import json; print(json.load(open('/tmp/pf-product-analysis.json'))['product_name'])") ==="
echo "Competidores: 5"
echo "Páginas de precios obtenidas: $(python3 -c "
import json
d = json.load(open('/tmp/pf-pricing-raw.json'))
high = sum(1 for r in d['results'] if r['data_quality'] == 'high')
med = sum(1 for r in d['results'] if r['data_quality'] == 'medium')
low = sum(1 for r in d['results'] if r['data_quality'] == 'low')
print(f'BUENO: {high}, OK: {med}, SOLO FRAGMENTO: {low}')
")"
echo "Tiempo de ejecución: ~3-5 minutos"

Individual skills in this repo

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

Varnan-Tech/opendirectory

Use when the user asks to generate a blog cover image, thumbnail, or article header. Automatically uses modern typography, brand logos, and Google Search grounding to create beautiful 16:9 images with Gemini 3.1 Flash Image Preview.

Varnan-Tech/opendirectory

World-class brand strategist and naming expert. Uses an interrogation-led discovery phase to extract your brand's DNA, then applies scientific naming frameworks (Phonosemantics) and automated multi-TLD domain checking.

Varnan-Tech/opendirectory

Use when the user asks to generate or update a project's CLAUDE or AGENTS context file from a codebase scan. Writes a focused file under 100 lines containing only the non-obvious build commands, conventions, and gotchas Claude Code needs.

Varnan-Tech/opendirectory

Use when the user wants to verify cold emails, enrich a lead list, or autonomously guess email addresses from a CSV using ValidEmail.co or the open-source Reacher engine.

Varnan-Tech/opendirectory

Competitive intelligence orchestrator tracking companies across 8+ platforms (GitHub, Twitter, Reddit, HN, PH, YC Jobs) with heat scores and AI briefings.

Varnan-Tech/opendirectory

Give it your product URL or description. It finds your top 5 competitors, runs three-track PR research across all of them (editorial, podcasts, communities), identifies which channels appear most frequently, looks up the journalist or host for each, and returns a tiered outreach list with story angles and ready-to-send cold pitch drafts tailored to your product. Use when asked to find PR opportunities, discover where competitors got featured, build a media outreach list, find which journalists cover my space, or get pitch templates for press coverage.

Varnan-Tech/opendirectory

Generate high-converting, deep-dive growth case studies in MDX format. Use this skill when asked to write a case study or blog post about a company's growth, tech stack, or product-led strategy. It handles the full pipeline (researching the company via Tavily, generating a 16:9 cover image, quality checking the draft, uploading assets to cloud storage, and pushing directly to the target repository).

Varnan-Tech/opendirectory

Scans your project for outdated npm, pip, Cargo, Go, or Ruby packages. Runs a CVE security audit. Fetches changelogs, summarizes breaking changes with Gemini, and opens one PR per risk group (patch, minor, major). Includes Diagnosis Mode for install conflicts. Use when asked to update dependencies, check for outdated packages, open dependency PRs, scan for package updates, audit for CVEs, or flag breaking changes in upgrades. Trigger when a user says "check for outdated packages", "update my dependencies", "open PRs for dependency updates", "scan for CVEs", or "which packages need upgrading".

Varnan-Tech/opendirectory

Generates and updates README.md and API reference docs by reading your codebase's functions, routes, types, schemas, and architecture. Uses graphify to build a knowledge graph first, then writes accurate docs from it. Use when asked to write docs, generate a README, document an API, update stale docs, create an API reference from code, add an architecture section, or document a project in any language. Trigger when a user says their docs are missing, outdated, or wants to document their codebase without writing it manually.

Varnan-Tech/opendirectory

Evaluates expired domain candidates against a target niche, scores them by topical relevance, historical activity level, and history cleanliness, then outputs a ranked shortlist with explainable reasoning and risk flags.

Varnan-Tech/opendirectory

Brutally honest developer-experience audit for a GitHub repo. Scores 10 DX dimensions (time-to-first-success, README clarity, visual proof, install, quick-start, docs, examples, community, trust, marketing), writes a shareable roast in the requested tone (brutal/honest/kind), produces a prioritized action plan ranked by impact × effort, and sketches an ideal README. Trigger when user says "roast my repo", "audit my README", "dx audit", "developer experience review", "score my GitHub project", "before launch checklist", or "make my repo shareable".

Varnan-Tech/opendirectory

Drafts and designs a complete HTML email newsletter from a topic or content brief. Outputs paste-ready HTML for Loops, Mailchimp, Beehiiv, Resend, or any standard email platform. Includes subject line options and plain-text fallback. Trigger when a user says "write a newsletter", "draft an email newsletter", "create an HTML email", "design an email for my subscribers", or "write a newsletter about [topic]".

Varnan-Tech/opendirectory

Takes a GitHub PR URL or the current branch and writes a plain-English explanation of what it does and why, then posts it as a PR comment. Use when asked to explain a PR, summarize a pull request, write a plain-English description of a PR, add a summary comment to a PR, or understand what a PR changes. Trigger when a user says "explain this PR", "summarize this pull request", "what does this PR do", "add a comment explaining the PR", or shares a GitHub PR URL and asks what it does.

Varnan-Tech/opendirectory

Audit how often LLMs recommend your brand vs competitors and generate a GEO action plan.

Varnan-Tech/opendirectory

Takes a competitor's public GitHub repo URL, fetches their open issues via the GitHub REST API, filters noise locally, clusters issues into 6 demand categories, computes a demand score per issue and per cluster, and outputs a ranked demand gap report with a GTM messaging brief. Use when asked to scan a competitor's GitHub issues, find what their users are begging for, turn GitHub complaints into product positioning, identify competitor feature gaps, or generate messaging from real user demand. Trigger when a user says "scan competitor issues", "what are users asking for on X repo", "find demand gaps in Y", "turn GitHub issues into messaging", or "what should I build based on competitor complaints".

Varnan-Tech/opendirectory

Find recurring confusion in your repo's GitHub Discussions, rank it by urgency, and draft the actual docs fixes and content angles — with verbatim community quotes and source links as evidence.

Varnan-Tech/opendirectory

SEO keyword research workflow for blog generation using Google Trends data. Use when writing blog posts, planning content calendars, or optimizing articles for search engines. Finds breakout keywords, builds content structure, and generates SEO-optimized blog outlines targeting tech and developer audiences.

Varnan-Tech/opendirectory

Generates a professionally designed case study PDF for B2B SaaS sales and marketing. Supports 7 page layouts, 9 style presets, 1-4 page output. Trigger when user says "create a case study", "write a customer story", "make a case study PDF", "design a success story", "turn this customer win into a PDF".

Varnan-Tech/opendirectory

Generates data visualization charts (bar, line, area, pie, doughnut, scatter, radar, treemap) as PNG using Apache ECharts v6. 1080×1080px default, 5 style presets, highlight annotations. Trigger when user says "create a chart", "visualize data", "make a bar chart", "line graph", "pie chart", "data visualization", "chart this data", "plot", "graph", or "visualize these numbers".

Varnan-Tech/opendirectory

Fetches low-star App Store and Google Play reviews, clusters them into broken-promise patterns, and generates a ranked copy brief with positioning opportunities.

Skills relacionados