Communitygithub.com

Varnan-Tech/opendirectory

製品のユーティリティとICP(理想的な顧客像)を基に、インターネットを検索して顧客が実際に活動する具体的なチャネルを見つけ出します。リーチ可能性でランク付けし、チャネルごとに完全なプレイブックを提供します。ICPがそこにいる証拠、1つのエントリ戦術、1つのコンテンツアングル、および具体的なアンチパターンを返します。

opendirectory とは?

これは、与えられた製品のユーティリティと理想的な顧客プロファイル(ICP)に基づいて、顧客が実際に活動するオンラインチャネルを発見・分析するAIエージェントスキルです。Reddit API、Hacker News Algolia API、DuckDuckGo検索を駆使し、Slack、Discord、ニュースレター、ポッドキャスト、カンファレンスなどのコミュニティを信号トレースします。各チャネルは、ICPシグナル数、メンバー数、アクティビティ、競合の存在に基づいてスコアリングされ、上位のチャネルに対しては、具体的なエントリ戦術、コンテンツアングル、アンチパターンを含む詳細なプレイブックを生成します。データの正確性を重視し、チャネル名やメンバー数は実際のAPI応答または検索結果からのみ取得します。このスキルはClaude Code、Codex、CursorなどのAIエージェントプラットフォームで動作するように設計されており、マーケティングやセールス担当者が理想的な顧客にリーチするための実用的なインサイトを得るのに役立ちます。

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

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

あなたの顧客がいる場所

与えられた製品ユーティリティとICPに基づいて、実際のICPのペインポストを元のコミュニティまでトレースします。競合の議論シグナルをレイヤー化します。DuckDuckGoを介してSlack/Discord/ニュースレター/ポッドキャスト/カンファレンスのチャネルを発見します。すべてのチャネルをICPシグナル数、規模、アクティビティ、競合の存在でスコアリングします。ランク付けされたプレイブックを出力します:証拠、エントリ戦術、コンテンツアングル、アンチパターン - チャネルごとに1つ。推測はしません。信号トレースされたチャネルのみです。


重要なルール: 出力内のすべてのチャネル名は、この実行におけるReddit API応答またはDuckDuckGo検索結果に存在している必要があります。すべてのメンバー数は、about.json APIまたは検索スニペットから取得する必要があります - 決して推定しないでください。すべてのICPシグナル数は、生データと一致する必要があります。チャネルタイプの結果が0の場合は、0と報告してください - チャネルを捏造しないでください。


よくある間違い

エージェントがやってしまいがちなことなぜそれが間違いか
一般的なチャネル(「LinkedIn」「Twitter」)を推奨するすべてのチャネルは、名前、メンバー数、URLを具体的に指定する必要があります。「LinkedInグループ:エンタープライズチームのためのDevOps(45Kメンバー)」- 「LinkedIn」だけではありません。
すべてのICPに同じチャネルを使用する信号トレースはICP固有です。DevOpsのICPとFinanceのICPでは、まったく異なるチャネルリストが生成されます。ICPごとにスクリプトを新たに実行してください。
メンバー数やコミュニティ名を捏造するすべてのチャネル名はDuckDuckGoの結果またはReddit APIから取得する必要があります。すべてのメンバー数はAPIまたは検索スニペットから取得する必要があります。入手できない場合は、「メンバー数不明」と記載してください。
競合レイヤーをスキップする競合が議論されている場所 = あなたのICPが代替案を評価している場所 = 最もホットなアウトリーチのコンテキストです。ユーザーが求めていなくても、常に競合検索を実行してください。
製品の売り込みになるようなエントリ戦術を書く「r/devops にあなたの製品について投稿する」はエントリ戦術ではありません。エントリ戦術は、具体的なスレッドタイプ、コンテンツ形式、およびコミュニティの規範を指定します。
Redditを唯一のチャネルタイプとして扱う出力には少なくとも3つのチャネルタイプを含める必要があります。Redditしか見つからない場合は、DuckDuckGoでSlack/Discord/ニュースレター/カンファレンスを明示的に検索してから停止してください。

ステップ1:セットアップチェック

echo "GITHUB_TOKEN: ${GITHUB_TOKEN:-未設定 -- 非認証時は競合レイヤーが60 req/hrで実行されます}"
echo ""
echo "この実行で使用するデータソース:"
echo "  Reddit public JSON   (認証不要, 信号トレース)"
echo "  Reddit about.json    (認証不要, サブレディットメタデータ)"
echo "  HN Algolia API       (認証不要, 信号トレース)"
echo "  DuckDuckGo HTML      (認証不要, チャネル発見)"
echo "  GitHub API           (${GITHUB_TOKEN:+認証済み, }競合エンリッチメントに任意)"

GITHUB_TOKEN が設定されていなくても続行してください。すべてのコアチャネル発見はそれなしで動作します。


ステップ2:ICPの解析

会話から収集します:

  • product -- 製品の機能(一文)
  • icp_role -- ICPの役割(例:「テクニカル共同創業者」、「シリーズAのDevOpsエンジニア」)
  • icp_pain -- 彼らの主要な問題(例:「顧客獲得」、「アラート疲れ」)
  • category -- 市場カテゴリのキーワード(例:「スタートアップGTMセールス」、「devopsモニタリング」)
  • competitors -- 任意の競合名(例:「Clay, Apollo, HubSpot」)

ICPカスケード:

  1. ユーザーのプロンプトにproduct + icp_role + icp_painが含まれている場合:それらを直接抽出して続行します。
  2. プロンプトが不十分な場合(カテゴリまたは製品名のみ):docs/icp.md に保存済みのICPプロファイルがないか確認します。プロンプトの詳細とマージします。
  3. それでも不十分な場合(icp_roleまたはicp_painがない):以下の3つの質問を1つずつ行います。
    • 「あなたの製品は何をする製品ですか?(一文で)」
    • 「あなたの理想的な顧客は誰ですか?(役割、会社の種類、チーム規模)」
    • 「あなたの製品を見つける前の、彼らの主要な問題は何ですか?」
  4. 最終的なICPを docs/icp.md に保存して、他のスキルが再利用できるようにします。

docs/icp.md にまだこの製品が含まれていない場合、ICPファイルを保存します:

python3 << 'PYEOF'
import json, os

icp = {
    "product": "PRODUCT_HERE",
    "icp_role": "ICP_ROLE_HERE",
    "icp_pain": "ICP_PAIN_HERE",
    "competitors": ["COMP_1", "COMP_2"],
    "category": "CATEGORY_HERE"
}

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

# Update docs/icp.md
icp_md_path = "docs/icp.md"
new_block = f"""## {icp['product']}
- **ICP role:** {icp['icp_role']}
- **ICP pain:** {icp['icp_pain']}
- **Competitors:** {', '.join(icp['competitors']) if icp['competitors'] else 'none'}
- **Category:** {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 saved to {icp_md_path}")
else:
    print(f"ICP already in {icp_md_path}")

print(f"Product: {icp['product']}")
print(f"ICP role: {icp['icp_role']}")
print(f"ICP pain: {icp['icp_pain']}")
print(f"Competitors: {', '.join(icp['competitors']) if icp['competitors'] else 'none'}")
PYEOF

ステップ3:スタンドアロンデータ収集スクリプトの実行

スクリプトが存在するか確認します:

ls scripts/fetch.py 2>/dev/null && echo "script available" || echo "not found"

チャネル発見を実行します:

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

完了を待ちます(最大5分 - Reddit + DuckDuckGo検索で合計約120秒かかります)。

出力を確認します:

python3 -c "
import json
with open('/tmp/wcl-raw.json') as f:
    d = json.load(f)
print(f'Reddit posts found: {d[\"reddit_posts_found\"]}')
print(f'HN signals found:   {d[\"hn_signals_found\"]}')
print(f'Channels discovered: {d[\"summary\"][\"total_channels\"]}')
print(f'Top priority:        {len(d[\"summary\"][\"top_priority\"])}')
print(f'By type:             {d[\"summary\"][\"by_type\"]}')
print(f'Competitor layer ran: {d[\"summary\"][\"competitor_layer_ran\"]}')
"

total_channels < 3 の場合:ユーザーに次のように伝えます:「3つ未満のチャネルしか見つかりませんでした。ICPの説明がReddit/DDGのカバレッジに対して狭すぎる可能性があります。より広いカテゴリキーワードを試すか、競合レイヤーをアクティブにするために競合名を追加してください。」その後、停止する前に、より広いカテゴリキーワードを使用して1回の再試行を行います。


ステップ4:チャネルサマリーの表示

生データを読み込み、ランク付けされたサマリーテーブルを表示します:

python3 -c "
import json
with open('/tmp/wcl-raw.json') as f:
    d = json.load(f)
channels = d['channels_discovered']
print(f'Channels found: {len(channels)}')
print()
print(f'{'#':<4} {'Channel':<35} {'Type':<14} {'Members':<12} {'ICP signals':<13} {'Score':<8} Tier')
print('-' * 100)
for i, ch in enumerate(channels[:15], 1):
    members = ch.get('members', 0)
    m_str = f'{members//1000}K' if members >= 1000 else str(members) if members 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\",\"\")}')
"

最高スコアのチャネルから上位3つの証拠投稿を表示します:

python3 -c "
import json
with open('/tmp/wcl-raw.json') as f:
    d = json.load(f)
channels = d['channels_discovered']
if channels:
    top = channels[0]
    print(f'Top channel: {top[\"name\"]}')
    print(f'Evidence posts:')
    for ep in top.get('evidence_posts', [])[:3]:
        print(f'  [{ep.get(\"score\",0):.0f}] {ep.get(\"title\",\"\")}')
        print(f'       {ep.get(\"url\",\"\")}')
"

ステップ5:AIチャネルエンリッチメント

生のチャネルデータが準備できました。トッププライオリティおよびハイティアの各チャネルについて、プレイブックエントリを生成します。

すべてのチャネルを読み込みます:

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

上記の各チャネルについて、以下を生成します:

who_is_here: このチャネルに存在する特定のタイプのICPを説明する2文。証拠投稿、サブレディットの説明、ICPプロファイルから導出します。「あなたのターゲットオーディエンス」とは書かないでください - 具体的に記述してください。例:「50〜500人の企業で、専任のSREチームなしでインフラスタックを所有するDevOpsエンジニア。彼らはオンコールの burnout、Kubernetesのスプロール、クラウドネイティブとセルフホスト型のオブザーバビリティの選択について投稿しています。」

entry_tactic: 1つの具体的で実行可能なエントリ行動。スレッドタイプ、投稿形式、コミュニティの規範を指定します。「コミュニティに参加する」ではありません。例:毎週月曜日にautomoderatorが投稿する「今週の取り組みは?」スレッドを見つけます。あなたが解決した技術的な課題を3文で返信します - 何が壊れたか、何を試したか、何がうまくいったか。製品について言及しないでください。スタンドアロンのコンテンツを投稿する前にカルマを構築してください。

content_angle: この特定のチャネルで最もエンゲージメントが高いコンテンツ形式。証拠投稿のタイトルとスコアから導出します。例:「技術的なポストモーテムは、製品発表を5:1で上回るエンゲージメントを獲得します。形式:「20万人のユーザーをXからYに移行しました - 何が壊れて、なぜそうなったか」具体的な数字 + 失敗したこと = 最も多くのupvotes。」

anti_patterns: このコミュニティで投稿が削除されたり、評判が損なわれたりする具体的な行動を2〜3つ。サブレディットのルール(説明で入手可能な場合)と証拠投稿のパターンから導出します。例:["プロモーションではないスレッドに製品リンクを投稿する - モデレーターが数時間以内に削除します", 「具体的なコンテキストなしで「どのツールを使っていますか?」と尋ねる - 市場調査ファーミングとしてフラグが立てられます」]

エンリッチされたプレイブックを /tmp/wcl-channels.json に書き込みます:

{
  "playbook": [
    {
      "channel": "r/devops",
      "evidence": "ここで34のICPシグナルがトレースされました。平均ペインスコア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'Playbook entries: {len(d[\"playbook\"])}')
for p in d['playbook']:
    print(f'  {p[\"channel\"]}')
"

ステップ6:完全なランク付け出力の生成

完全なランク付けプレイブックを /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']}
channels = 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 channels:
    name = ch['name']
    playbook = playbook_by_channel.get(name, {})
    output['channels'].append({
        "rank": channels.index(ch) + 1,
        "name": name,
        "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"Output written: /tmp/wcl-output.json")
print(f"Total channels: {len(output['channels'])}")
PYEOF

ステップ7:自己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']}
passes = 0
fails = 0

# Check 1: No em dashes
if chr(8212) in full_text:
    print('FAIL: em dash found in output -- replace with hyphen')
    fails += 1
else:
    print('PASS: no em dashes')
    passes += 1

# Check 2: No banned words
banned = ['powerful', 'robust', 'seamless', 'innovative', 'game-changing',
          'streamline', 'leverage', 'transform', 'revolutionize']
found = [w for w in banned if w.lower() in full_text.lower()]
if found:
    print(f'FAIL: banned words: {found}')
    fails += 1
else:
    print('PASS: no banned words')
    passes += 1

# Check 3: At least 3 channel types
types = {ch['type'] for ch in output['channels']}
if len(types) < 3:
    print(f'FAIL: only {len(types)} channel type(s) in output: {types}')
    fails += 1
else:
    print(f'PASS: {len(types)} channel types: {types}')
    passes += 1

# Check 4: All channel names exist in raw data
for ch in output['channels']:
    if ch['name'].lower() not in raw_channel_names:
        print(f'FAIL: channel not in raw data: {ch[\"name\"]}')
        fails += 1

if fails == 0:
    print('PASS: all channel names verified in raw data')
    passes += 1

# Check 5: No generic entry tactics
generic_phrases = ['engage with the community', 'post about your product', 'share your content']
for ch in output['channels']:
    tactic = ch.get('entry_tactic', '').lower()
    for phrase in generic_phrases:
        if phrase in tactic:
            print(f'FAIL: generic entry tactic in {ch[\"name\"]}: \"{phrase}\"')
            fails += 1

if fails == 0:
    print('PASS: no generic entry tactics found')
    passes += 1

print(f'\\nResults: {passes} passed, {fails} failed')
if fails > 0:
    exit(1)
"

ステップ8:出力の表示

結果をきれいに表示します:

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

print('=' * 80)
print('RANKED CHANNEL PLAYBOOK')
print(f'Product: {output[\"product\"]}')
print(f'Target ICP: {output[\"icp_role\"]}')
print(f'Primary pain: {output[\"icp_pain\"]}')
print(f'Competitors: {\", \".join(output[\"competitors\"]) if output[\"competitors\"] else \"none\"}')
print(f'Total channels found: {output[\"total_channels\"]}')
print('=' * 80)
print()

for ch in output['channels']:
    print(f'### {ch[\"rank\"]}. {ch[\"name\"]} ({ch[\"type\"]})')
    print(f'   Tier: {ch[\"tier\"]} | Score: {ch[\"channel_score\"]} | Members: {ch[\"members\"]} | ICP signals: {ch[\"icp_signal_count\"]}')
    if ch.get('who_is_here'):
        print(f'   Who is here: {ch[\"who_is_here\"]}')
    if ch.get('entry_tactic'):
        print(f'   Entry tactic: {ch[\"entry_tactic\"]}')
    if ch.get('content_angle'):
        print(f'   Content angle: {ch[\"content_angle\"]}')
    if ch.get('anti_patterns'):
        print(f'   Anti-patterns:')
        for ap in ch['anti_patterns']:
            print(f'     - {ap}')
    if ch.get('evidence_posts'):
        print(f'   Evidence:')
        for ep in ch['evidence_posts'][:3]:
            print(f'     [{ep.get(\"score\",0):.0f}] {ep.get(\"title\",\"\")}')
            print(f'       {ep.get(\"url\",\"\")}')
    print()
"

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.

関連スキル