Skip to content
Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

17 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ“Ή Watch the Demo: https://youtu.be/9bDrL2iw4JU

🎯 Automated Job Matcher & Email System

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.

✨ Features

  • 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

πŸ“ Project Structure

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

πŸš€ Quick Start

1. Install Dependencies

# Install Python packages
pip install -r requirements.txt

# Install Playwright for LinkedIn scraping (if needed)
playwright install chromium

2. Configure Environment Variables

Edit .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

Get Gmail App Password:

  1. Go to https://myaccount.google.com/apppasswords
  2. Create password for "Mail"
  3. Copy the 16-character password (remove spaces)
  4. Add to .env file

Get Gemini API Key:

  1. Go to https://aistudio.google.com/app/apikey
  2. Create API key
  3. Add to .env file

πŸ“Š End-to-End Flow

Complete Pipeline Flow:

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

🎯 How to Run

Option 1: Run Complete Pipeline (Recommended)

# From root directory
python3 run_pipeline.py

This will:

  1. βœ… Load jobs from all sources in data/ folder
  2. πŸ€– Match jobs with your resume using AI
  3. πŸ“Š Rank and select top 50 matches
  4. πŸ“§ Send email with job details

Option 2: Run Individual Components

Collect GitHub & Web Jobs:

cd github_collector
python3 main.py

Output: ../data/jobs_output.json

Collect LinkedIn Jobs:

cd linkedin_collector
python3 search_and_save.py

Output: ../data/linkedin_*.json

Match Jobs with Resume:

python3 job_matcher.py

Input: All JSON files in data/ Output: matched_jobs/top_50_matches.json

Send Email:

python3 send_email_smtp.py

Input: matched_jobs/top_50_matches.json

πŸ“ Configuration Files

.env (Root Directory)

Single source of truth for all API keys and credentials. Used by all collectors.

config.yaml (Root Directory)

Job collection settings:

  • GitHub search keywords
  • Web scraping targets
  • Collection limits
  • Output format settings

search_keywords.txt (Root Directory)

Search terms for GitHub & web scraping job collection.

linkedin_collector/job_keywords.txt

Search terms for LinkedIn job collection in format:

keyword | location | limit
machine learning engineer | Remote | 30
data scientist | San Francisco | 25

πŸ“‚ Data Organization

All job data is centralized in the data/ folder:

  • jobs_output.json - GitHub and web scraper jobs
  • linkedin_*.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

πŸ”§ Customization

Add More Job Sources

Edit config.yaml to add new web scraping targets:

web_scraping:
  sites:
    - name: "YourJobBoard"
      url: "https://yourjobboard.com/jobs"
      enabled: true

Modify Search Keywords

Edit 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

πŸ› Troubleshooting

Jobs not collecting?

  • Check .env file has correct API keys
  • Verify config.yaml settings
  • Check network connectivity

LinkedIn not working?

  • Ensure LinkedIn credentials in .env
  • Run playwright install chromium
  • Check LinkedIn hasn't blocked your account

Email not sending?

  • Verify Gmail app password (not regular password)
  • Check recipient email in .env
  • Ensure 2FA is enabled on Gmail account

πŸ“„ License

This project is for educational and personal use.

🀝 Contributing

Feel free to submit issues or pull requests to improve the pipeline!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages