[agent-idea] Open-Source Lead Intelligence Agent — From GitHub Signals to Qualified Pipeline
Summary
An agent that scans GitHub repositories for high-value stargazers and contributors, enriches them with business data via Apollo, scores them against configurable ICP criteria, and — with human approval — creates qualified contacts in HubSpot and notifies the team via Slack. Optionally, with explicit opt-in, it can draft and send personalized outreach emails with individual human review.
This is the first template to demonstrate multi-tool CRM integration (GitHub + Apollo + HubSpot + Slack + CSV), showcasing nearly every advanced framework feature in a single, production-realistic agent.
Responsible use policy: This agent only processes publicly available GitHub profile data. CRM records are created from data the user has voluntarily published. Email outreach is disabled by default and, when enabled, requires explicit human approval for every individual message. No scraping of private profiles, social networks, or restricted sources.
The Problem
Developer-led growth (PLG) companies have a massive untapped lead source: the people starring, forking, and contributing to their GitHub repositories. These are high-intent signals — someone who starred your repo is far more likely to convert than a cold prospect.
But nobody acts on these signals systematically because:
- GitHub stargazers are just usernames — no business context, no company info
- Manual enrichment doesn't scale — looking up each stargazer in Apollo/CRM is tedious
- Signal decay — by the time someone notices and acts, the interest is stale
- No pipeline exists to filter bots from real leads, score them, and route to sales
Who needs this? Every developer tools company, open-source company, and DevRel-driven organization. Companies like Supabase, Vercel, Hashicorp — and Aden/Hive itself.
Architecture
12 nodes, ~16 edges — the most feature-rich template in the Hive ecosystem.
The default flow ends at CRM sync + Slack notification. Email outreach is an optional branch enabled via configuration.
+------------------+
| config_intake | event_loop, client_facing
| User specifies |
| repo + ICP + |
| options |
+--------+---------+
|
on_success
|
+--------v---------+
| github_scan | event_loop
| Fetch recent |
| stargazers + |
| contributors |
+--------+---------+
|
on_success
|
+--------v---------+
| profile_filter | function (deterministic)
| Remove bots, |
| empty profiles, |
| low-signal accs |
+--------+---------+
|
on_success
|
+--------v---------+
| enrich_batch | event_loop
| Apollo enrich |
| each user |
+--------+---------+
|
on_success
(unenriched leads
get lower scores —
no fallback scraping)
|
+--------v---------+
| lead_scoring | function (deterministic)
| ICP scoring: |
| title, company |
| size, industry |
+---+----------+---+
| |
conditional conditional
score >= 70 score < 70
| |
+--------v---+ +---v--------------+
| review_leads| | save_nurture_list| event_loop
| event_loop, | | Export low-score |
| client_facing| | leads to CSV |
| HITL: user | +------------------+
| approves |
| leads |
+------+------+
|
on_success
|
+------------+-------------+
| |
on_success conditional:
| email_enabled == true
| |
+--------v--------+ +--------v---------+
| crm_sync | | draft_outreach | event_loop
| event_loop | | Personalized |
| HubSpot: | | emails using |
| contacts + | | GitHub + Apollo |
| companies + | | context |
| deals + tasks | +--------+---------+
+--------+--------+ |
| on_success
| |
| +--------v----------+
| | approve_send | event_loop, client_facing
| | HITL: human |
| | reviews EVERY |
| | email |
| +--------+----------+
| |
| on_success
| |
| +--------v--------+
| | send_emails | event_loop
| | Via Resend |
| +--------+--------+
| |
+------------+------------+
|
on_success
|
+--------v---------+
| slack_report | event_loop
| Post campaign |
| summary to |
| team channel |
+------------------+Node Specifications
1. config_intake — event_loop, client_facing
Input: (entry point)
Output: repo_urls, icp_criteria, max_leads, email_enabled
User specifies:
- Which GitHub repositories to scan
- Ideal customer profile (ICP) criteria: target titles, company sizes, industries
- How many leads to process
- Whether email outreach is enabled (default: false)
- If email enabled: outreach context (product name, value prop, tone)
2. github_scan — event_loop
Input: repo_urls, max_leads
Output: raw_profiles
Tools: github_list_stargazers, github_get_user_profile
Fetches recent stargazers and contributors. For each, retrieves publicly available profile data: bio, company field, location, email (only if user has made it public), repos count, followers. Prioritizes recent activity.
3. profile_filter — function (deterministic)
Input: raw_profiles, icp_criteria
Output: filtered_profiles, filter_stats
No LLM call. Pure Python logic:
- Remove bot accounts (username patterns, no repos, no bio)
- Remove profiles with fewer than N public repos (configurable)
- Remove profiles with no company or bio information
- Return filter statistics (total scanned, passed, filtered by reason)
def filter_profiles(raw_profiles: list, icp_criteria: dict) -> dict:
filtered = []
stats = {"total": len(raw_profiles), "bots": 0, "low_signal": 0, "passed": 0}
for profile in raw_profiles:
if is_bot(profile):
stats["bots"] += 1
continue
if profile.get("public_repos", 0) < icp_criteria.get("min_repos", 3):
stats["low_signal"] += 1
continue
if not profile.get("company") and not profile.get("bio"):
stats["low_signal"] += 1
continue
filtered.append(profile)
stats["passed"] += 1
return {"filtered_profiles": filtered, "filter_stats": stats}4. enrich_batch — event_loop
Input: filtered_profiles
Output: enriched_leads
Tools: apollo_enrich_person, apollo_enrich_company
For each filtered profile, attempts Apollo enrichment using public email or name+company. Retrieves: title, seniority, department, company size, industry, revenue, tech stack.
When Apollo has no match for a profile, the lead is not discarded — it continues to scoring with whatever data is available from GitHub (company field, bio, repos). Incomplete data results in a lower score, which is the correct behavior: less data = less confidence = lower priority.
No web scraping fallback. We deliberately avoid scraping LinkedIn, social profiles, or other restricted sources. Only data from GitHub's public API and Apollo's legitimate enrichment database is used.
5. lead_scoring — function (deterministic)
Input: enriched_leads, icp_criteria
Output: scored_leads, high_score_leads, low_score_leads
No LLM call. Weighted scoring based on configurable ICP criteria:
def score_leads(enriched_leads: list, icp_criteria: dict) -> dict:
weights = {
"title_match": 0.25, # Does their title match target personas?
"company_size": 0.20, # Is the company in the right size range?
"industry_fit": 0.20, # Is the industry relevant?
"seniority": 0.15, # Decision-maker vs. individual contributor?
"enrichment_depth": 0.10, # How much data do we have? (penalizes unknowns)
"engagement": 0.10, # GitHub activity level (stars, forks, contributions)
}
scored = []
for lead in enriched_leads:
score = compute_weighted_score(lead, icp_criteria, weights)
lead["lead_score"] = score
scored.append(lead)
high = [l for l in scored if l["lead_score"] >= 70]
low = [l for l in scored if l["lead_score"] < 70]
return {"scored_leads": scored, "high_score_leads": high, "low_score_leads": low}Note the enrichment_depth signal: leads with incomplete data are automatically scored lower, creating a natural quality gradient without needing a scraping fallback.
6. review_leads — event_loop, client_facing
Input: high_score_leads, filter_stats
Output: approved_leads
Tools: save_data, load_data
Presents the top-scoring leads to the user in a formatted table: name, title, company, score, GitHub profile, key signals. User selects which leads to proceed with. HITL checkpoint #2.
7. save_nurture_list — event_loop
Input: low_score_leads
Output: nurture_file
Tools: csv_write, save_data
Exports low-score leads to a CSV file for future reference. Not discarded — saved as a long-term asset with all available data.
8. crm_sync — event_loop
Input: approved_leads
Output: crm_results
Tools: hubspot_create_contact, hubspot_create_company, hubspot_create_deal
For each approved lead:
- Creates or updates a HubSpot contact with all enrichment data
- Creates or links the associated company record
- Creates a deal tagged with source
github-signalfor attribution tracking - Creates a task assigned to the appropriate sales rep
This is the default terminal action — every run creates CRM records, regardless of email configuration.
9. draft_outreach — event_loop (optional, requires email_enabled)
Input: approved_leads, outreach_context
Output: email_drafts
Only activated when email_enabled == true in config. For each approved lead, drafts a personalized email that references:
- Their specific GitHub activity (what repo they starred, any contributions)
- Their role and company context (from Apollo enrichment)
- The product's relevance to their likely needs
- A clear, respectful call-to-action
10. approve_send — event_loop, client_facing (optional)
Input: email_drafts
Output: approved_emails, rejected_emails
Presents every email draft to the user for individual review. User can approve, edit, or reject each one. HITL checkpoint #3 — no email goes out without explicit human approval for that specific message.
11. send_emails — event_loop (optional)
Input: approved_emails
Output: send_results
Tools: send_email
Sends approved emails via Resend. Respects configurable rate limits (default: max 20 emails per run) to prevent any perception of bulk outreach.
12. slack_report — event_loop
Input: crm_results, send_results (if email enabled), filter_stats
Output: report_status
Tools: slack_send_message
Posts a campaign summary to the team's Slack channel:
- Repo(s) scanned and date range
- Funnel metrics: profiles found → filtered → enriched → scored → approved
- Top leads with scores and companies
- CRM records created
- Emails sent (if enabled)
- Link to nurture CSV
Edge Specifications
| # | Source | Target | Condition | Notes |
|---|---|---|---|---|
| 1 | config_intake | github_scan | on_success | |
| 2 | github_scan | profile_filter | on_success | |
| 3 | profile_filter | enrich_batch | on_success | |
| 4 | enrich_batch | lead_scoring | on_success | All leads (enriched + partial) |
| 5 | lead_scoring | review_leads | conditional: len(high_score_leads) > 0 |
High-score path |
| 6 | lead_scoring | save_nurture_list | on_success | Low-score always saved |
| 7 | review_leads | crm_sync | on_success | Always — CRM is the default action |
| 8 | review_leads | draft_outreach | conditional: email_enabled == true |
Optional email branch |
| 9 | draft_outreach | approve_send | on_success | |
| 10 | approve_send | send_emails | on_success | |
| 11 | crm_sync | slack_report | on_success | Default path convergence |
| 12 | send_emails | slack_report | on_success | Email path convergence |
Advanced Framework Features Demonstrated
This template exercises more framework features than any existing template:
| Feature | How It's Used | Existing Templates |
|---|---|---|
| Function nodes (2x) | profile_filter + lead_scoring — deterministic, no LLM |
None use function nodes |
| Conditional routing (2x) | Score-based lead routing + email opt-in branch | Only deep_research (basic) |
| Fan-out / Fan-in | crm_sync + email branch converge at slack_report | None use fan-out |
| HITL (up to 3 checkpoints) | Config, lead review, email approval | None use human_input |
| client_facing nodes (up to 3x) | config_intake, review_leads, approve_send | Templates use 1 max |
| 5 tool integrations | GitHub, Apollo, HubSpot, Slack, CSV (+Email when enabled) | Templates use 1-2 |
| Optional branch | Email outreach is a conditional subgraph | No template has optional paths |
Tool Usage
| Tool | Node | Purpose |
|---|---|---|
github_list_stargazers |
github_scan | Fetch stargazer list from target repos |
github_get_user_profile |
github_scan | Get public profile details for each stargazer |
apollo_enrich_person |
enrich_batch | Business enrichment (title, company, seniority) |
apollo_enrich_company |
enrich_batch | Company firmographics (size, industry, revenue) |
save_data / load_data |
review_leads | Persist lead data for HITL review |
csv_write |
save_nurture_list | Export low-score leads for future reference |
hubspot_create_contact |
crm_sync | Create contacts with enrichment data |
hubspot_create_company |
crm_sync | Create/link company records |
hubspot_create_deal |
crm_sync | Create deals for pipeline tracking |
slack_send_message |
slack_report | Post campaign summary to team channel |
send_email |
send_emails | (Optional) Send approved outreach via Resend |
Data & Privacy Policy
This agent adheres to responsible data practices:
- Public data only — All data comes from GitHub's public API and Apollo's legitimate enrichment database. No scraping of LinkedIn, social media, or restricted sources.
- No email by default — The default flow creates CRM records and Slack notifications only. Email outreach requires explicit opt-in via
email_enabledconfiguration. - Individual human approval — When email is enabled, every single message is reviewed and approved by a human before sending. No bulk or automated sending.
- Rate limiting — Configurable maximum emails per run (default: 20) to prevent any perception of bulk outreach.
- Attribution tracking — All CRM records are tagged with
github-signalsource for transparency about how the lead was identified. - API rate limits respected — GitHub API (5,000 req/hour authenticated) and Apollo credits are managed within the agent.
Why This Agent Is Differentiated
vs. Existing Templates
Every current Hive template (tech_news, twitter_outreach, deep_research) follows the same pattern: linear chain of event_loop nodes doing "search → analyze → output." This agent uses function nodes, conditional routing, fan-out/fan-in, optional branches, and multi-checkpoint HITL — patterns that exist in the framework but have never been demonstrated.
vs. Existing Proposals
No existing proposal combines GitHub signals with CRM automation. The closest are SDR/prospecting agents (#3829, #3991), but those work with cold lists — this works with warm signals (people who already showed interest in your project).
vs. Simple Scripts
A script could fetch stargazers and dump them to a CSV. It cannot:
- Intelligently filter bots vs. real developers (requires pattern matching + heuristics in a function node)
- Score leads against configurable ICP criteria with enrichment depth awareness (function node)
- Present leads for human judgment before any action (HITL)
- Draft genuinely personalized emails referencing specific GitHub activity (LLM reasoning)
- Orchestrate CRM sync and email in parallel (fan-out)
- Self-report results to the team channel (multi-tool integration)
The Demo Story
Point this agent at Hive's own repository. It finds people who starred adenhq/hive, identifies which ones work at companies that could use an AI agent framework, enriches them with Apollo, scores them, and creates qualified contacts in HubSpot with full context. The demo literally generates pipeline for Aden — from the project's own community signals.
Non-Overlap Verification
| Existing Proposal | Scope | Overlap |
|---|---|---|
| #4205 Account Intelligence | Research existing accounts from multiple sources | None — this creates NEW leads from GitHub signals |
| #4224 Vulnerability Auditor | Security scanning of dependencies | None — different domain |
| #4286 Agent QA Pipeline | Meta-circular agent testing | None — different domain |
| #3829 SDR Agent | Cold outbound prospecting | Minimal — SDR uses cold lists, this uses warm signals |
| #3991 B2B Prospecting | Lead generation from databases | Minimal — different signal source (GitHub vs. databases) |
| #4264 Content Research Swarm | Multi-agent content pipeline | None — different domain |
Implementation Complexity
Estimated effort: Medium (12 nodes, but each has clear bounded scope)
Can be built incrementally:
- Phase 1 (core): config_intake → github_scan → profile_filter → lead_scoring → review_leads → crm_sync →
Source: aden-hive/hive