Automated pipeline that scrapes AI/ML hiring and funding posts from X.com, LinkedIn, and news sites, finds relevant contacts, drafts personalized cold emails, and sends them -- all on autopilot.
-
Install dependencies:
pip install -r requirements.txt playwright install chromium
-
Configure credentials:
cp .env.example .env # Edit .env with your actual credentials -
Set up Notion:
- Create an integration at https://www.notion.so/my-integrations
- Create a page and connect the integration to it
- The pipeline will auto-create the databases on first run
-
First run (manual):
python main.py --run-now
- Browser windows will open for LinkedIn and X.com login on first run
- Log in manually; sessions are saved for future runs
The pipeline now runs headless by default (scraping.headless: true), so no browser window opens during normal runs.
For authenticated X/LinkedIn scraping in headless mode, seed sessions once:
python setup_sessions.py --platform bothAfter that, all runs stay headless:
python demo.py
python main.py --run-nowIf LinkedIn People search is blocked/unstable for your account, use direct profile lookup:
python find_email_from_linkedin_profile.py --linkedin-url "https://www.linkedin.com/in/USERNAME/"Recommended for best accuracy:
python find_email_from_linkedin_profile.py \
--linkedin-url "https://www.linkedin.com/in/USERNAME/" \
--company "OpenAI" \
--domain "openai.com"If LinkedIn shows security verification, run with visible browser:
python find_email_from_linkedin_profile.py --linkedin-url "..." --headful- Install as daily service (runs at 6 AM):
bash install_service.sh
- Scrapers: Playwright (X.com, LinkedIn), BeautifulSoup (TechCrunch, Google News)
- Processing: Rule-based classifier + regex extractor + two-layer dedup
- Research: LinkedIn people search + email pattern guessing + SMTP verification
- Outreach: Groq LLM drafting + Gmail SMTP sending
- Storage: Notion databases (Leads, Contacts, Outreach)
- Orchestration: CrewAI agents + macOS launchd scheduling
The marketing site (ColdApply landing page) runs separately from the Python pipeline.
Why you see Can't resolve 'tailwindcss': The bundler resolves modules from the current working directory. If you run npm run dev from the project root (custom-cold-applying/) instead of from frontend/, it looks for tailwindcss in the root and fails. Fix: run from frontend/ or use the root scripts below.
From custom-cold-applying/:
-
Install frontend dependencies (first time only):
npm run frontend:install
-
Start the dev server:
npm run frontend
-
Open http://localhost:3000 in your browser.
cd frontend
npm install # first time only
npm run devThen open http://localhost:3000.
Other commands (from inside frontend/): npm run build, npm run start
$0. Everything uses free tiers or open-source tools.