Lead capture from Reddit, Discord and GitHub with hybrid LLM scoring and outreach drafts.
Project description
growth-tools
Automated lead capture from Reddit, Discord and GitHub — with hybrid LLM scoring and outreach drafts.
Built for dev-tool and SaaS companies that want inbound signal from developer communities without hiring a full-time growth team.
Quick start
# Clone and install
git clone https://github.com/ownmy-app/growth-tools
cd growth-tools
pip install -e .
# Configure your environment
cp examples/sample-icp.env .env
# Edit .env with your API keys and brand config
# Run Reddit monitor (one-shot)
growth-reddit
# Run the website auditor API
growth-api
# or: uvicorn growth_tools.api.main:app --port 8000
# Run tests
pytest tests/ -v
Required environment variables (see examples/sample-icp.env):
OPENAI_API_KEY=sk-proj-...
REDDIT_CLIENT_ID=...
REDDIT_CLIENT_SECRET=...
BRAND_NAME="Your Product"
ICP_KEYWORDS="supabase,self-host,postgres,..."
What's included
| Module | What it does |
|---|---|
systems/reddit_capture.py |
Monitors subreddits, two-stage filter (keyword → LLM), saves hot leads |
systems/discord_bot.py |
Discord bot with per-channel cooldown, confidence threshold gating |
systems/website_auditor.py |
Detects tech stack from HTML/headers (Next.js, Vite, Supabase, Vercel…) |
systems/github_auditor.py |
Scans repos for migration readiness (package.json, Dockerfile analysis) |
systems/crm_sequencer.py |
LLM-generated outreach drafts (capped at 90 words for reply rates) |
core/scoring.py |
Hybrid rule + LLM scoring: 0.5 × rule_score + 0.5 × llm_intent_score |
core/llm.py |
OpenAI client with fallback model + tenacity retries |
api/main.py |
FastAPI: POST /audit/website, POST /audit/github, GET /health |
Scoring tiers
| Score | Tier | Action |
|---|---|---|
| ≥ 80 | hot | Immediate outreach |
| 60–79 | nurture | Add to sequence |
| 40–59 | educate | Send content |
| < 40 | ignore | Skip |
Rule signals: +25 high-intent builder (Lovable/Replit/Bolt/v0), +30 high-intent pain
(deploy/migrate/security/ownership), +20 has public repo, +25 mentions clients.
Blended 50/50 with LLM intent score.
Supabase schema
create table lead_signals (
id uuid primary key default gen_random_uuid(),
source text, -- 'reddit' | 'discord' | 'github'
title text,
body text,
url text,
author text,
intent_score int,
tier text,
builder text,
pain_type text,
reply_draft text,
created_at timestamptz default now()
);
Setup
git clone https://github.com/ownmy-app/growth-tools
cd growth-tools
pip install -e .
cp examples/sample-icp.env .env
# Edit .env
Run
# Reddit monitor (one-shot)
growth-reddit
# Discord bot (persistent)
python -m growth_tools.systems.discord_bot
# Website auditor API
growth-api
# or: uvicorn growth_tools.api.main:app --port 8000
# Audit a specific website
curl -X POST http://localhost:8000/audit/website -H 'Content-Type: application/json' \
-d '{"url": "https://example.com"}'
Customise
Target subreddits — set ICP_KEYWORDS in .env
Lead scoring — edit weights in core/scoring.py (or move to YAML config)
Outreach tone — edit prompts in core/llm.py
Immediate next steps
- Make subreddits + keywords configurable via env / YAML
- Add GitHub lead capture (scan repos that import competitor SDKs)
- Add Slack notification on "hot" leads
- Package as
pip install growth-tools
Commercial viability
- Open-core: open source the capture + scoring, charge for the CRM sequencer
- SaaS: $200–500/mo per team for managed lead pipeline
- Competitors: Trigify, Drippi — neither does GitHub + Reddit + LLM scoring combined
Example output
Running pytest tests/ -v:
============================= test session starts ==============================
platform darwin -- Python 3.13.9, pytest-9.0.2, pluggy-1.5.0
cachedir: .pytest_cache
rootdir: /tmp/ownmy-releases/growth-tools
configfile: pyproject.toml
plugins: anyio-4.12.1, cov-7.1.0
collecting ... collected 4 items
tests/test_brand_config.py::test_brand_name_reads_from_env PASSED [ 25%]
tests/test_brand_config.py::test_brand_tagline_reads_from_env PASSED [ 50%]
tests/test_brand_config.py::test_icp_pain_reads_from_env PASSED [ 75%]
tests/test_brand_config.py::test_no_hardcoded_brand_names_in_source PASSED [100%]
============================== 4 passed in 0.03s ===============================
See examples/sample-leads.json for representative scored lead output and examples/sample-icp.env for required environment variable configuration.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file growth_tools-0.1.0.tar.gz.
File metadata
- Download URL: growth_tools-0.1.0.tar.gz
- Upload date:
- Size: 40.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d5cca9b45048c671a2b7959bad22ba9759a11299878e27e3ead17a9ce5d76fa
|
|
| MD5 |
32d6db5797e7db5817d1da78d021acf1
|
|
| BLAKE2b-256 |
afca10f2f8e53688524a4b6b8d9c6078907681e172e451425b96bff0880202aa
|
File details
Details for the file growth_tools-0.1.0-py3-none-any.whl.
File metadata
- Download URL: growth_tools-0.1.0-py3-none-any.whl
- Upload date:
- Size: 27.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fcf4f9672f4310afcdc36be6fb176bbac9ff2d90adbd1a921a3abcfc027e49c8
|
|
| MD5 |
4164d354b5cce847707c38a597bced71
|
|
| BLAKE2b-256 |
59c782eab4692c0c1c9515248ed98b27e148c10cfdd7b131bca2ef4f6989ec74
|