πΉ Watch the Demo: https://youtu.be/9bDrL2iw4JU
An intelligent end-to-end job application pipeline that collects jobs from multiple sources, matches them with your resume using AI, and emails the top matches.
- Multi-Source Job Collection: Automatically collects jobs from LinkedIn, GitHub, and web sources
- AI-Powered Matching: Uses Google Gemini AI to match jobs with your resume
- Smart Ranking: Ranks jobs by relevance with detailed match reasoning
- Automated Email Delivery: Sends top 50 job matches via Gmail SMTP
- Complete Automation: Organized pipeline with centralized configuration
Datathon/
βββ .env # π Single environment file (API keys & credentials)
βββ config.yaml # βοΈ Collection settings
βββ search_keywords.txt # π Search terms for job collection
βββ requirements.txt # π¦ Python dependencies
β
βββ collectors/ # π Job collection modules
β βββ github_discovery.py # Discover GitHub job repos
β βββ github_fetcher.py # Fetch jobs from GitHub
β βββ apify_scraper.py # Apify web scraper
β βββ firecrawl_scraper.py # Firecrawl LLM scraper
β
βββ github_collector/ # π GitHub job collection orchestrator
β βββ main.py # Main orchestrator for GitHub & web scraping
β βββ README.md # GitHub collector docs
β
βββ linkedin_collector/ # πΌ LinkedIn job collection
β βββ search_and_save.py # LinkedIn job search & save
β βββ job_saver.py # Job saving utility
β βββ mcp_server.py # LinkedIn MCP server
β βββ job_keywords.txt # LinkedIn search keywords
β βββ README.md # LinkedIn collector docs
β
βββ data/ # πΎ Unified data directory
β βββ jobs_output.json # GitHub & web scraper jobs
β βββ linkedin_*.json # LinkedIn job files
β
βββ models/ # π Data models
β βββ job.py # Job data structure
β
βββ matched_jobs/ # π― AI matching results
β βββ top_50_matches.json # Top 50 ranked jobs
β
βββ job_matcher.py # π€ AI job matching engine
βββ send_email_smtp.py # π§ Gmail email sender
βββ run_pipeline.py # π Main automation pipeline
βββ view_jobs.py # π View collected jobs
# Install Python packages
pip install -r requirements.txt
# Install Playwright for LinkedIn scraping (if needed)
playwright install chromiumEdit .env file in the root directory with your credentials:
# Gemini API Key (REQUIRED for job matching)
GEMINI_API_KEY=your_gemini_api_key_here
# Gmail SMTP (REQUIRED for email sending)
EMAIL_USER=your_email@gmail.com
EMAIL_PASSWORD=your_16_char_app_password
# LinkedIn Credentials (for LinkedIn collector)
LINKEDIN_EMAIL=your_linkedin_email
LINKEDIN_PASSWORD=your_linkedin_password
# Optional: For additional sources
GITHUB_PERSONAL_ACCESS_TOKEN=your_github_token
FIRECRAWL_API_KEY=your_firecrawl_key
APIFY_API_TOKEN=your_apify_token- Go to https://myaccount.google.com/apppasswords
- Create password for "Mail"
- Copy the 16-character password (remove spaces)
- Add to
.envfile
- Go to https://aistudio.google.com/app/apikey
- Create API key
- Add to
.envfile
1. JOB COLLECTION
βββ GitHub Collector (github_collector/main.py)
β βββ Searches GitHub repos for job postings
β βββ Web scraping (Firecrawl/Apify)
β βββ Saves to: data/jobs_output.json
β
βββ LinkedIn Collector (linkedin_collector/search_and_save.py)
βββ Searches LinkedIn for jobs
βββ Saves to: data/linkedin_*.json
2. JOB MATCHING (job_matcher.py)
βββ Loads all jobs from data/ folder
βββ Uses Google Gemini AI for matching
βββ Ranks jobs by relevance
βββ Saves to: matched_jobs/top_50_matches.json
3. EMAIL DELIVERY (send_email_smtp.py)
βββ Sends top 50 matches via Gmail SMTP
# From root directory
python3 run_pipeline.pyThis will:
- β
Load jobs from all sources in
data/folder - π€ Match jobs with your resume using AI
- π Rank and select top 50 matches
- π§ Send email with job details
cd github_collector
python3 main.pyOutput: ../data/jobs_output.json
cd linkedin_collector
python3 search_and_save.pyOutput: ../data/linkedin_*.json
python3 job_matcher.pyInput: All JSON files in data/
Output: matched_jobs/top_50_matches.json
python3 send_email_smtp.pyInput: matched_jobs/top_50_matches.json
Single source of truth for all API keys and credentials. Used by all collectors.
Job collection settings:
- GitHub search keywords
- Web scraping targets
- Collection limits
- Output format settings
Search terms for GitHub & web scraping job collection.
Search terms for LinkedIn job collection in format:
keyword | location | limit
machine learning engineer | Remote | 30
data scientist | San Francisco | 25
All job data is centralized in the data/ folder:
jobs_output.json- GitHub and web scraper jobslinkedin_*.json- LinkedIn job files (multiple files possible)
This centralized approach makes it easy to:
- Process all jobs together
- Deduplicate across sources
- Archive or version control job data
Edit config.yaml to add new web scraping targets:
web_scraping:
sites:
- name: "YourJobBoard"
url: "https://yourjobboard.com/jobs"
enabled: trueEdit search_keywords.txt for GitHub/web scraping:
machine learning new grad
AI engineer 2026
data scientist entry level
Edit linkedin_collector/job_keywords.txt for LinkedIn:
machine learning | Remote | 30
AI engineer | San Francisco | 25
- Check
.envfile has correct API keys - Verify
config.yamlsettings - Check network connectivity
- Ensure LinkedIn credentials in
.env - Run
playwright install chromium - Check LinkedIn hasn't blocked your account
- Verify Gmail app password (not regular password)
- Check recipient email in
.env - Ensure 2FA is enabled on Gmail account
This project is for educational and personal use.
Feel free to submit issues or pull requests to improve the pipeline!