Communitygithub.com

Varnan-Tech/opendirectory

Pesquisa na internet para encontrar canais específicos onde seu cliente ideal realmente está, ranqueados por acessibilidade, com um guia completo por canal. Retorna evidências de que seu ICP está lá, uma tática de entrada, um ângulo de conteúdo e antipadrões específicos por canal.

O que é opendirectory?

Esta skill do agente de IA identifica os canais online exatos onde seu Cliente Ideal (ICP) está mais ativo, com base em evidências de dados reais. Em vez de recomendar canais genéricos como LinkedIn ou Twitter, ela busca fóruns, comunidades Slack/Discord, newsletters, podcasts e conferências específicos, analisando postagens sobre dor e concorrentes de várias fontes (Reddit, Hacker News, DuckDuckGo, GitHub). Cada canal é pontuado por contagem de sinais do ICP, tamanho, atividade e presença de concorrentes, gerando um "playbook" (guia) detalhado. A saída inclui quem está no canal, uma tática de entrada acionável, um ângulo de conteúdo de alto engajamento e antipadrões específicos para evitar, garantindo que você não desperdice tempo ou reputação em comunidades irrelevantes.

Funciona com✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/Varnan-Tech/opendirectory/tree/main/skills/where-your-customer-lives

Perguntar na sua IA favorita

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

Documentação

Onde Seu Cliente Mora

Dada a utilidade de um produto e seu ICP, rastreie postagens reais de dor do ICP de volta às suas comunidades de origem. Adicione sinais de discussão de concorrentes. Descubra canais Slack/Discord/newsletter/podcast/conferência via DuckDuckGo. Pontue cada canal por contagem de sinais do ICP, tamanho, atividade e presença de concorrentes. Produza um playbook ranqueado: evidência, tática de entrada, ângulo de conteúdo, antipadrões -- um por canal. Sem suposições. Apenas canais rastreados por sinais.


Regra crítica: Cada nome de canal na saída deve existir na resposta da API do Reddit ou nos resultados de busca do DuckDuckGo desta execução. Cada contagem de membros deve vir da API about.json ou de um snippet de busca -- nunca estimada. Cada contagem de sinal do ICP deve corresponder aos dados brutos. Se um tipo de canal retornar 0 resultados, reporte 0 -- não fabrique canais.


Erros Comuns

O agente vai querer...Por que isso está errado
Recomendar canais genéricos ("LinkedIn", "Twitter")Cada canal deve ser específico com nome, contagem de membros e URL. "Grupo do LinkedIn: DevOps para Equipes Empresariais (45 mil membros)" -- não apenas "LinkedIn".
Usar os mesmos canais para todo ICPO rastreamento de sinais é específico do ICP. Um ICP de DevOps e um ICP de Finanças produzem listas de canais totalmente diferentes. Execute o script fresco para cada ICP.
Inventar contagens de membros ou nomes de comunidadesCada nome de canal deve vir dos resultados do DuckDuckGo ou da API do Reddit. Cada contagem de membros deve vir da API ou de um snippet de busca. Se indisponível, escreva "contagem de membros não encontrada".
Pular a camada de concorrentesOnde concorrentes são discutidos = seu ICP está avaliando alternativas = contexto de divulgação mais quente. Sempre execute a busca por concorrentes mesmo que o usuário não tenha pedido.
Escrever táticas de entrada que são pitches de produto"Poste sobre seu produto no r/devops" não é uma tática de entrada. Táticas de entrada nomeiam o tipo específico de thread, formato de conteúdo e norma da comunidade.
Tratar Reddit como o único tipo de canalA saída deve incluir pelo menos 3 tipos de canal. Se apenas Reddit for encontrado, busque explicitamente no DuckDuckGo por Slack/Discord/newsletter/conferência antes de parar.

Passo 1: Verificação de Configuração

echo "GITHUB_TOKEN: ${GITHUB_TOKEN:-não definido -- camada de concorrentes roda a 60 req/h sem autenticação}"
echo ""
echo "Fontes de dados que esta execução usará:"
echo "  Reddit public JSON   (sem auth, rastreamento de sinais)"
echo "  Reddit about.json    (sem auth, metadados do subreddit)"
echo "  HN Algolia API       (sem auth, rastreamento de sinais)"
echo "  DuckDuckGo HTML      (sem auth, descoberta de canais)"
echo "  GitHub API           (${GITHUB_TOKEN:+autenticada, }opcional para enriquecimento de concorrentes)"

Se GITHUB_TOKEN não estiver definido: continue. Toda a descoberta principal de canais funciona sem ele.


Passo 2: Analisar ICP

Colete da conversa:

  • product -- o que o produto faz (uma frase)
  • icp_role -- quem é o ICP (ex.: "co-fundadores técnicos", "engenheiros DevOps em empresas Série A")
  • icp_pain -- o problema principal deles (ex.: "aquisição de clientes", "fadiga de alertas")
  • category -- palavras-chave da categoria de mercado (ex.: "vendas gtm startup", "monitoramento devops")
  • competitors -- nomes de concorrentes opcionais (ex.: "Clay, Apollo, HubSpot")

Cascata do ICP:

  1. Se o prompt do usuário contiver produto + icp_role + icp_pain: extraia-os diretamente e prossiga.
  2. Se o prompt for raso (apenas categoria ou apenas nome do produto): verifique docs/icp.md em busca de um perfil ICP salvo. Mescle com os detalhes do prompt.
  3. Se ainda for insuficiente (faltando icp_role ou icp_pain): faça estas 3 perguntas, uma de cada vez:
    • "O que seu produto faz em uma frase?"
    • "Quem é seu cliente ideal? (cargo, tipo de empresa, tamanho da equipe)"
    • "Qual é o problema principal deles antes de encontrarem seu produto?"
  4. Salve o ICP final em docs/icp.md para que outras skills possam reutilizá-lo.

Salve o arquivo ICP se docs/icp.md ainda não contiver este produto:

python3 << 'PYEOF'
import json, os

icp = {
    "product": "PRODUTO_AQUI",
    "icp_role": "CARGO_ICP_AQUI",
    "icp_pain": "DOR_ICP_AQUI",
    "competitors": ["COMP_1", "COMP_2"],
    "category": "CATEGORIA_AQUI"
}

os.makedirs("docs", exist_ok=True)
with open("/tmp/wcl-input.json", "w") as f:
    json.dump(icp, f, indent=2)

# Atualizar docs/icp.md
icp_md_path = "docs/icp.md"
new_block = f"""## {icp['product']}
- **Cargo ICP:** {icp['icp_role']}
- **Dor ICP:** {icp['icp_pain']}
- **Concorrentes:** {', '.join(icp['competitors']) if icp['competitors'] else 'nenhum'}
- **Categoria:** {icp['category']}
"""
existing = open(icp_md_path).read() if os.path.exists(icp_md_path) else ""
if icp['product'] not in existing:
    with open(icp_md_path, "a") as f:
        f.write(new_block)
    print(f"ICP salvo em {icp_md_path}")
else:
    print(f"ICP já existe em {icp_md_path}")

print(f"Produto: {icp['product']}")
print(f"Cargo ICP: {icp['icp_role']}")
print(f"Dor ICP: {icp['icp_pain']}")
print(f"Concorrentes: {', '.join(icp['competitors']) if icp['competitors'] else 'nenhum'}")
PYEOF

Passo 3: Executar o Script Autônomo de Coleta de Dados

Verifique se o script existe:

ls scripts/fetch.py 2>/dev/null && echo "script disponível" || echo "não encontrado"

Execute a descoberta de canais:

GITHUB_TOKEN="${GITHUB_TOKEN:-}" python3 scripts/fetch.py \
    "$(python3 -c "import json; d=json.load(open('/tmp/wcl-input.json')); print(d['category'])")" \
    --icp-role "$(python3 -c "import json; d=json.load(open('/tmp/wcl-input.json')); print(d['icp_role'])")" \
    --icp-pain "$(python3 -c "import json; d=json.load(open('/tmp/wcl-input.json')); print(d['icp_pain'])")" \
    --product "$(python3 -c "import json; d=json.load(open('/tmp/wcl-input.json')); print(d['product'])")" \
    --competitors "$(python3 -c "import json; d=json.load(open('/tmp/wcl-input.json')); print(','.join(d['competitors']))")" \
    --output /tmp/wcl-raw.json

Aguarde a conclusão (permita até 5 minutos -- buscas Reddit + DuckDuckGo levam ~120 segundos no total).

Verifique a saída:

python3 -c "
import json
with open('/tmp/wcl-raw.json') as f:
    d = json.load(f)
print(f'Posts do Reddit encontrados: {d[\"reddit_posts_found\"]}')
print(f'Sinais HN encontrados:   {d[\"hn_signals_found\"]}')
print(f'Canais descobertos: {d[\"summary\"][\"total_channels\"]}')
print(f'Maior prioridade:        {len(d[\"summary\"][\"top_priority\"])}')
print(f'Por tipo:             {d[\"summary\"][\"by_type\"]}')
print(f'Camada concorrente executada: {d[\"summary\"][\"competitor_layer_ran\"]}')
"

Se total_channels < 3: informe ao usuário: "Menos de 3 canais encontrados. A descrição do ICP pode ser muito restrita para cobertura do Reddit/DDG. Tente palavras-chave de categoria mais amplas ou adicione nomes de concorrentes para ativar a camada de concorrentes." Em seguida, tente uma nova tentativa com palavras-chave de categoria mais amplas antes de parar.


Passo 4: Imprimir Resumo dos Canais

Carregue os dados brutos e imprima uma tabela de resumo ranqueada:

python3 -c "
import json
with open('/tmp/wcl-raw.json') as f:
    d = json.load(f)
canais = d['channels_discovered']
print(f'Canais encontrados: {len(canais)}')
print()
print(f'{'#':<4} {'Canal':<35} {'Tipo':<14} {'Membros':<12} {'Sinais ICP':<13} {'Pontuação':<8} Camada')
print('-' * 100)
for i, ch in enumerate(canais[:15], 1):
    membros = ch.get('members', 0)
    m_str = f'{membros//1000}K' if membros >= 1000 else str(membros) if membros else '?'
    print(f'{i:<4} {ch[\"name\"]:<35} {ch[\"type\"]:<14} {m_str:<12} {ch.get(\"icp_signal_count\",0):<13} {ch.get(\"channel_score\",0):<8} {ch.get(\"tier\",\"\")}')
"

Imprima os 3 principais posts de evidência do canal com pontuação mais alta:

python3 -c "
import json
with open('/tmp/wcl-raw.json') as f:
    d = json.load(f)
canais = d['channels_discovered']
if canais:
    top = canais[0]
    print(f'Canal principal: {top[\"name\"]}')
    print(f'Posts de evidência:')
    for ep in top.get('evidence_posts', [])[:3]:
        print(f'  [{ep.get(\"score\",0):.0f}] {ep.get(\"title\",\"\")}')
        print(f'       {ep.get(\"url\",\"\")}')
"

Passo 5: Enriquecimento de Canal com IA

Agora você tem os dados brutos do canal. Para cada canal nas camadas de maior prioridade e alta, gere uma entrada de playbook.

Carregue todos os canais:

python3 -c "
import json
with open('/tmp/wcl-raw.json') as f:
    d = json.load(f)
top_canais = [ch for ch in d['channels_discovered'] if ch.get('tier') in ('top-priority', 'high')]
print(json.dumps(top_canais, indent=2))
"

Para cada canal acima, gere:

quem_esta_aqui: 2 frases descrevendo o tipo específico de ICP presente neste canal. Derive dos posts de evidência, descrição do subreddit e perfil do ICP. NÃO escreva "seu público-alvo" -- seja específico. Exemplo: "Engenheiros DevOps em empresas de 50 a 500 funcionários que são donos da pilha de infra sem uma equipe dedicada de SRE. Eles postam sobre burnout de plantão, proliferação de Kubernetes e a escolha entre observabilidade cloud-native e auto-hospedada."

tatica_entrada: Um passo de entrada específico e acionável. Nomeie o tipo de thread, formato de postagem e norma da comunidade. NÃO "envolva-se com a comunidade." Exemplo: "Encontre o thread semanal 'No que você está trabalhando?' (postado toda segunda-feira pelo automoderador). Responda com um desafio técnico de 3 frases que você resolveu -- o que quebrou, o que você tentou, o que funcionou. Sem menção ao produto. Construa karma antes de postar conteúdo autônomo."

angulo_conteudo: O formato de conteúdo que gera maior engajamento neste canal específico, derivado dos títulos e pontuações dos posts de evidência. Exemplo: "Post-mortems técnicos superam anúncios de produto em 5:1 aqui. Formato: 'Migramos 200K usuários de X para Y -- aqui está o que quebrou e por quê.' Números concretos + o que falhou = mais upvotes."

antipadroes: 2-3 comportamentos específicos que fazem posts serem removidos ou a reputação ser destruída nesta comunidade. Derive das regras do subreddit (se disponíveis na descrição) e padrões dos posts de evidência. Exemplo: ["Postar links de produtos em threads não promocionais -- moderadores removem em horas", "Perguntar 'quais ferramentas vocês usam?' sem contexto específico -- sinalizado como pesquisa de mercado"]

Escreva o playbook enriquecido em /tmp/wcl-channels.json:

{
  "playbook": [
    {
      "channel": "r/devops",
      "evidence": "34 sinais ICP rastreados aqui, pontuação média de dor 180",
      "who_is_here": "...",
      "entry_tactic": "...",
      "content_angle": "...",
      "anti_patterns": ["...", "..."]
    }
  ]
}
python3 -c "
import json
with open('/tmp/wcl-channels.json') as f:
    d = json.load(f)
print(f'Entradas do playbook: {len(d[\"playbook\"])}')
for p in d['playbook']:
    print(f'  {p[\"channel\"]}')
"

Passo 6: Gerar Saída Ranqueada Completa

Escreva o playbook ranqueado completo em /tmp/wcl-output.json:

python3 << 'PYEOF'
import json
from datetime import datetime

with open('/tmp/wcl-input.json') as f:
    inp = json.load(f)
with open('/tmp/wcl-raw.json') as f:
    raw = json.load(f)
with open('/tmp/wcl-channels.json') as f:
    enriched = json.load(f)

playbook_by_channel = {p['channel']: p for p in enriched['playbook']}
canais = raw['channels_discovered']

output = {
    "date": raw['date'],
    "product": inp['product'],
    "icp_role": inp['icp_role'],
    "icp_pain": inp['icp_pain'],
    "competitors": inp.get('competitors', []),
    "total_channels": raw['summary']['total_channels'],
    "channels": []
}

for ch in canais:
    nome = ch['name']
    playbook = playbook_by_channel.get(nome, {})
    output['channels'].append({
        "rank": canais.index(ch) + 1,
        "name": nome,
        "type": ch['type'],
        "url": ch['url'],
        "members": ch.get('members', 0),
        "active_users": ch.get('active_users', 0),
        "icp_signal_count": ch.get('icp_signal_count', 0),
        "competitor_mentions": ch.get('competitor_mentions', 0),
        "channel_score": ch.get('channel_score', 0),
        "tier": ch.get('tier', ''),
        "entry_type": ch.get('entry_type', 'open'),
        "evidence_posts": ch.get('evidence_posts', []),
        "who_is_here": playbook.get('who_is_here', ''),
        "entry_tactic": playbook.get('entry_tactic', ''),
        "content_angle": playbook.get('content_angle', ''),
        "anti_patterns": playbook.get('anti_patterns', []),
    })

with open('/tmp/wcl-output.json', 'w') as f:
    json.dump(output, f, indent=2)

print(f"Saída escrita: /tmp/wcl-output.json")
print(f"Total de canais: {len(output['channels'])}")
PYEOF

Passo 7: Auto-QA

python3 -c "
import json

with open('/tmp/wcl-raw.json') as f:
    raw = json.load(f)
with open('/tmp/wcl-output.json') as f:
    output = json.load(f)

full_text = json.dumps(output)
raw_channel_names = {ch['name'].lower() for ch in raw['channels_discovered']}
aprovacoes = 0
falhas = 0

# Verificação 1: Sem travessões em
if chr(8212) in full_text:
    print('FALHA: travessão em encontrado na saída -- substitua por hífen')
    falhas += 1
else:
    print('APROVADO: sem travessões em')
    aprovacoes += 1

# Verificação 2: Sem palavras proibidas
banidas = ['poderoso', 'robusto', 'perfeito', 'inovador', 'revolucionário',
          'otimizar', 'alavancar', 'transformar', 'revolucionar']
encontradas = [p for p in banidas if p.lower() in full_text.lower()]
if encontradas:
    print(f'FALHA: palavras proibidas encontradas: {encontradas}')
    falhas += 1
else:
    print('APROVADO: sem palavras proibidas')
    aprovacoes += 1

# Verificação 3: Pelo menos 3 tipos de canal
tipos = {ch['type'] for ch in output['channels']}
if len(tipos) < 3:
    print(f'FALHA: apenas {len(tipos)} tipo(s) de canal na saída: {tipos}')
    falhas += 1
else:
    print(f'APROVADO: {len(tipos)} tipos de canal: {tipos}')
    aprovacoes += 1

# Verificação 4: Todos os nomes de canais existem nos dados brutos
for ch in output['channels']:
    if ch['name'].lower() not in raw_channel_names:
        print(f'FALHA: canal não está nos dados brutos: {ch[\"name\"]}')
        falhas += 1

if falhas == 0:
    print('APROVADO: todos os nomes de canais verificados nos dados brutos')
    aprovacoes += 1

# Verificação 5: Sem táticas de entrada genéricas
frases_genericas = ['envolva-se com a comunidade', 'poste sobre seu produto', 'compartilhe seu conteúdo']
for ch in output['channels']:
    tactica = ch.get('entry_tactic', '').lower()
    for phrase in frases_genericas:
        if phrase in tactica:
            print(f'FALHA: tática de entrada genérica em {ch[\"name\"]}: {phrase}')
            falhas += 1

if all(phrase not in ch.get('entry_tactic', '').lower() for ch in output['channels'] for phrase in frases_genericas):
    print('APROVADO: sem táticas de entrada genéricas')
    aprovacoes += 1

print(f'\nResultado: {aprovacoes} aprovado(s), {falhas} falha(s)')
if falhas > 0:
    print('Corrija as falhas antes de exibir o playbook.')
else:
    print('Todas as verificações passaram. Playbook pronto para exibição.')
"

Passo 8: Apresentar

python3 -c "
import json
with open('/tmp/wcl-output.json') as f:
    output = json.load(f)

print(f'# {output[\"product\"]} -- Playbook de Canais')
print()
print(f'**ICP:** {output[\"icp_role\"]} com {output[\"icp_pain\"]}')
if output.get('competitors'):
    print(f'**Concorrentes:** {\", \".join(output[\"competitors\"])}')
print()
print(f'{len(output[\"channels\"])} canais encontrados')
print()
print('---')
print()

for idx, ch in enumerate(output['channels'], 1):
    badge = ''
    if ch['tier'] == 'top-priority':
        badge = ' ## MELHOR'
    print(f'## {idx}. {ch[\"name\"]}{badge}')
    print()
    tipo = ch['type']
    membros = ch['members']
    m_str = f'{membros//1000}K' if membros >= 1000 else str(membros) if membros else '?'
    score = ch['channel_score']
    sinais = ch['icp_signal_count']
    print(f'- **Tipo:** {tipo}')
    print(f'- **Membros:** {m_str}')
    print(f'- **Pontuação do canal:** {score}')
    print(f'- **Sinais do ICP:** {sinais}')
    print(f'- **URL:** {ch[\"url\"]}')
    print()
    if ch.get('who_is_here'):
        print(f'### Quem está aqui')
        print(ch['who_is_here'])
        print()
    if ch.get('entry_tactic'):
        print(f'### Tática de entrada')
        print(ch['entry_tactic'])
        print()
    if ch.get('content_angle'):
        print(f'### Ângulo de conteúdo')
        print(ch['content_angle'])
        print()
    if ch.get('anti_patterns'):
        print(f'### Antipadrões')
        for ap in ch['anti_patterns']:
            print(f'- {ap}')
        print()
    if ch.get('evidence_posts'):
        print(f'### Evidência')
        for ep in ch['evidence_posts'][:5]:
            print(f'- [{ep.get(\"score\", 0):.0f}] {ep.get(\"title\", \"\")}')
            print(f'  {ep.get(\"url\", \"\")}')
        print()
    print('---')
    print()
"

Comandos Rápidos

Use estes para testar partes da skill sem executar o fluxo completo:

# Testar script de coleta de dados
bash scripts/fetch.sh

# Verificar dados brutos salvos
cat /tmp/wcl-raw.json | python3 -m json.tool | head -100

# Verificar saída final
cat /tmp/wcl-output.json | python3 -m json.tool | head -50

Perguntas Frequentes

P: O que acontece se nenhum canal for encontrado? R: Se um tipo de canal retornar 0 resultados, reporte 0 -- não fabrique canais. Alargue as palavras-chave da categoria ou adicione concorrentes.

P: Posso executar isso sem uma chave da API do GitHub? R: Sim. A descoberta principal de canais funciona sem ela. Apenas o enriquecimento de concorrentes (opcional) é limitado.

P: Quanto tempo leva? R: ~2 minutos para buscas no Reddit + DuckDuckGo. Mais 1-2 minutos para geração do playbook.

P: As contagens de membros são precisas? R: Elas vêm da API about.json do Reddit ou de snippets de busca do DuckDuckGo. Se indisponível, escrevemos "contagem de membros não encontrada". Nunca inventamos números.

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.

Habilidades Relacionadas