Extract and score leads from GitHub repositories by analyzing stars, forks, issues, PRs, comments, and contributions. Produces unified multi-repo CSV with deduplicated user profiles. No paid API credits required.
npx gooseworks install --all # then, in Claude Code, Cursor, or Codex: /gooseworks use the github-repo-signals skill
Extract high-intent leads from one or more GitHub repositories by analyzing every type of user interaction. This skill uses only free GitHub API data — no enrichment credits are spent.
Note: If the user describes their ICP as GitHub-active but hasn't identified specific repositories yet, this skill still applies. In that case, ask the user which repositories their ICP is likely to interact with, or help them identify relevant repos based on the technology/space they describe.
gh CLI authenticated (gh auth status to verify)PyYAML installedBefore running, ask the user for:
owner/repo stringsgh auth statuspython3 ${CLAUDE_SKILL_DIR}/scripts/gh_repo_signals.py \
--repos "owner1/repo1,owner2/repo2" \
--limit <USER_LIMIT> \
--output ${CLAUDE_SKILL_DIR}/../.tmp/repo_signals.csvReplace the repos and limit with user-provided values.
The tool will:
_users.csv and _interactions.csvThe tool produces two CSV files:
repo_signals_users.csv — One row per person, deduplicated across all repos
| Column | Description |
|---|---|
| username | GitHub login |
| name | Display name |
| Public GitHub email | |
| commit_email | Email from git commits (if different from public) |
| company | Company from GitHub profile |
| location | Location from GitHub profile |
| blog | Website/blog URL |
| Twitter/X handle | |
| bio | GitHub bio |
| followers | Follower count |
| public_repos | Number of public repos |
| total_repos_interacted | Number of input repos this user interacted with |
| interaction_score | Weighted score across all repos |
repo_signals_interactions.csv — One row per user x repo combination
| Column | Description |
|---|---|
| username | GitHub login |
| repository | Which repo this row is about |
| is_contributor | YES/NO |
| is_stargazer | YES/NO |
| is_forker | YES/NO |
| is_watcher | YES/NO |
| is_issue_opener | YES/NO |
| is_pr_author | YES/NO |
| is_issue_commenter | YES/NO |
| contribution_count | Number of commits (0 if not contributor) |
| starred_at | Date starred (if applicable) |
| forked_at | Date forked (if applicable) |
| repo_score | Interaction score for this specific repo |
Once the CSV files are generated, do not stop. Immediately proceed to analyze the data and brief the user.
Check if you already know the user's company and intent from prior conversation. If not, ask:
"Before I analyze these results, I need to understand who you're finding leads for:
- What does your company/product do? (one-liner is fine)
- Who is your ideal customer? (role, company size, industry, tech stack — whatever is relevant)
- What's the goal for these leads? (outbound sales, partnership, hiring, community building, etc.)"
Do NOT proceed to analysis until you have this context. It directly shapes the recommendations.
Read the generated .csv file and compute the following analysis. Present it to the user as a structured briefing.
6a. Overall Stats
6b. Multi-Repo Users (if multiple repos were scanned)
6c. Top Companies
6d. Interaction Patterns
6e. Data Gaps
Based on the analysis AND the user's company context/intent, recommend specific next steps. Tailor recommendations to what the data actually shows — do not give generic advice.
Framework for recommendations:
If multi-repo users exist (2+ repos):
If company clusters exist (3+ users from same company):
/enrich-company/enrich-lead to find the decision-maker at those companies (not the developer who starred — the person who signs off on purchases)If high email coverage (>40%):
/qa-agent to qualify them against ICP before reaching outIf low email coverage (<40%):
/find-email for the top-scored users firstIf the user's goal is outbound sales:
If the user's goal is community/partnerships:
Always include a cost estimate:
Format the recommendation as a clear action plan with numbered steps, estimated costs, and expected outcomes.
After presenting the analysis and recommendations, ask:
"Would you like me to proceed with any of these steps? I can start with [recommended first action] — it would cost approximately [estimate] and take [time estimate]."
Wait for user confirmation before spending any credits or running enrichment tools.
Render a 'model comparison grid' video from a config — a fal-style "same prompt, N contenders" showcase — a dark real-DOM stage where per beat a monospace prompt fades in centered, docks to a small top strip, then a labeled 2-4 panel grid (static images OR muted video clips, mixable per cell) staggers in and holds for comparison, plus a minimal end card — frame-stepped via Playwright (video cells are frame-seeked deterministically) and encoded with FFmpeg. Deterministic assembly, FREE (cell media comes from create-image-fal / create-video-fal, music from create-music-elevenlabs), text stays pixel-crisp. Use for the model-comparison-grid format.
Render a punchy ~12s vertical (9:16) music-only direct-response OFFER ad as a 4-beat kinetic-typography film — HEADLINE slam → real PRODUCT drop → CLAIM/proof → CTA pill — from one config of copy slots, a real product photo, a brand palette, fonts, bpm, and beat split. DETERMINISTIC + FREE (a bundled Remotion project; springs + interpolate, no AI-gen for visuals). Backgrounds are engine gradient divs off the palette, props are inline SVG, the ONLY composited bitmap is the REAL product photo (objectFit:contain, never stretched), and ALL headline/claim/CTA/URL/wordmark text is typeset in the engine — never AI-rendered (the format's credibility guard). A driver binds the config to Remotion input props, renders the 9:16 master, and derives a 1:1 center-crop with ffmpeg. Two gating checks run before render (claim verbs must match the product's physical format; the claim beat needs an edge-entry mechanism prop). Use for the motion-graphics-offer-ad format.
Assemble a myth-vs-fact kinetic-typography explainer video ad (≈29.5s, 9:16) from N myth/fact pairs + hook / turn / punch copy + palette + a brand end-card PNG + a VO track — a hook, 3 red-strike MYTH cards that flip to teal-check FACT cards (per-line strikethrough that crosses EVERY wrapped line), a "what actually works" turn, an optional proof reveal, a punch line, and a static end card. DETERMINISTIC assembly with ZERO AI-gen visuals — HTML hyperframes rendered frame-exact via Playwright (`window.renderAt(t)`, animation a pure function of beat-local time), Whisper beat-snap to VO word onsets, concat at a uniform fps, karaoke `.ass` captions burned last (suppressed on the proof + end-card beats), and a VO + optional music mix (music −20 dB, `amix normalize=0`, tail fade). FREE (Python + Playwright + ffmpeg); the recipe supplies the copy / palette / end-card / VO and gates the paid VO / music / Whisper calls to their own capabilities. Use for the myth-vs-fact format.