TDK-99/SnapplAI

πŸ” Stop refreshing LinkedIn. This pipeline scrapes new job listings based on your settings, uses AI agents to summarize each one and score it against your CV, then delivers only the best matches straight to your inbox πŸ“¬ β€” so you're always first to apply πŸš€

32

stars

165

commits

Python

primary language

Sep 8, 2026

updated

ai
ai-agent
ai-agents
ai-tools
automation
autonomous-agents
cve-scanning
googleaistudio
jobs
job-search
jobsearch
linkedin
python
smtp

README

πŸ” SnapplAI β€” AI-Powered LinkedIn Job Alerts

Stop refreshing LinkedIn. This pipeline scrapes new job listings based on your settings, uses AI agents to summarize each one and score it against your CV, then delivers only the best matches straight to your inbox πŸ“¬ β€” so you're always first to apply πŸš€

Python Google GenAI pandas python-jobspy License


πŸ“‘ Table of Contents


🎯 The Problem

Job hunting on LinkedIn is a full-time job in itself. New listings appear daily, most are irrelevant, and by the time you spot a good one, 200 people have already applied.

SnapplAI flips the game: it runs on a schedule, scrapes fresh listings, lets AI read and score every single one against your CV, and emails you only the top matches β€” before the crowd even sees them.


βš™οΈ How It Works

The pipeline runs in 4 sequential steps, fully automated:

1. Scrape β†’ job_scraper() pulls fresh listings from LinkedIn based on your search settings (role, location, filters) using python-jobspy.

2. Summarize β†’ agentic_summarize() sends each job description to Gemini, which extracts structured fields (title, seniority, skills, salary, etc.) as clean JSON.

3. Analyze β†’ agentic_analyze() reads your CV and scores each listing on how well it matches your profile. Chain-of-thought enforced: the model writes analysis before score in the JSON schema, so reasoning comes before judgment.

4. Deliver β†’ send_email() builds an email with the top-scored jobs and sends it to your inbox via SMTP.

Key principle: AI reads and evaluates. Python orchestrates and delivers. No frameworks, no agents-calling-agents β€” just a clean data pipeline with LLM calls where they matter.


πŸ”§ Tech Stack

ComponentTechnology
LLMGoogle GenAI SDK β€” gemini-3.5-flash-lite
Scrapingpython-jobspy (LinkedIn)
Datapandas, PyPDF / PyMuPDF
ParsingBeautifulSoup4
Emailsmtplib (SMTP)
Configpython-dotenv

πŸ—οΈ Pipeline Architecture

Pipeline Architecture

The entire pipeline operates on a single pandas DataFrame that gets enriched at each step. No intermediate files, no database β€” everything flows through memory.


πŸ“Š AI Output Fields

Pipeline Architecture

Each job in the email is ranked by match score and includes company, role, work mode, a one-line AI summary explaining why it matched (or didn't), and a direct apply link to the LinkedIn listing.


πŸš€ Setup

  1. Get a free API key from Google AI Studio
  2. Generate a Gmail App Password
  3. Place your CV (PDF) in your_cv_config/
  4. Configure search settings: use file_config.txt to create your file_config.env (filter docs)
  5. Create your .env from the template: cp example_env.txt .env

Deploy

Local

git clone https://github.com/TDK-99/SnapplAI.git && cd SnapplAI
pip install -r requirements.txt
# complete setup steps above
python main.py

Docker

git clone https://github.com/TDK-99/SnapplAI.git && cd SnapplAI
# complete setup steps above
docker build -t snapplai .
docker run --env-file .env snapplai

GitHub Actions

  1. Fork this repo (or create a private copy)
  2. Complete setup steps 1-4 above in your fork
  3. Edit your settings in .github/workflows/snapplai.yml under the env: block
  4. Add credentials as repository secrets (Settings β†’ Secrets β†’ Actions): GOOGLE_API_KEY, GMAIL_USER, GMAIL_APP_PASSWORD
  5. Actions tab β†’ enable workflows β†’ Run workflow

πŸ“ Project Structure

SnapplAI/
β”œβ”€β”€ main.py                 # Entry point β€” runs the 4-step pipeline
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ daily_scraper.py    # LinkedIn scraping with python-jobspy
β”‚   β”œβ”€β”€ ai_agents.py        # Gemini calls: summarize + analyze
β”‚   β”œβ”€β”€ smtp.py             # Email builder and SMTP sender
β”‚   └── pydantic.py         # pydantic class for force ai output
β”œβ”€β”€ your_cv_config/
β”‚   β”œβ”€β”€ .gitkeep            # Keeps folder tracked in git
β”‚   β”œβ”€β”€ file_config.env     # Your settings (role, location, filters)
β”‚   β”œβ”€β”€ file_config.txt     # Additional config parameters
β”‚   └── Your_CV.pdf         # Your CV goes here (PDF)
β”œβ”€β”€ .github/
β”‚   └── workflows/
β”‚       └── snapplai.yml    # GitHub Actions workflow (scheduled + manual)
β”œβ”€β”€ Dockerfile              # Run anywhere with Docker
β”œβ”€β”€ .env                    # API keys and SMTP credentials (git-ignored)
β”œβ”€β”€ example_env.txt         # Template for .env variables
β”œβ”€β”€ requirements.txt        # Dependencies
β”œβ”€β”€ LICENSE                 # MIT
└── README.md

πŸ›£οΈ Roadmap v2

  • βœ…Multi-country scraping β€” search across 2+ countries in a single run (custom feature, not supported by python-jobspy out of the box)
  • Excel/DB deduplication β€” persistent storage to compare runs and filter out already-seen listings, so you never score the same job twice
  • Scoring calibration β€” benchmark AI scores against known good/bad matches to improve match quality
  • Output redesign β€” better visual formatting for the email report (job cards, readability, direct links)
  • Fix issue β€” fix main issue: fallback model, smtp for non @gmail user and github action new user

🀝 Contributing

Contributions are welcome β€” bug fixes, new features, or docs improvements.

  • Issues β€” Report bugs or suggest features
  • Pull Requests β€” Fork, build, submit

πŸ“„ License

MIT β€” see LICENSE

Contributors

TDK-99

148 commits

danyijia

17 commits

TDK-99/SnapplAI

πŸ” Stop refreshing LinkedIn. This pipeline scrapes new job listings based on your settings, uses AI agents to summarize each one and score it against your CV, then delivers only the best matches straight to your inbox πŸ“¬ β€” so you're always first to apply πŸš€

32

stars

165

commits

Python

primary language

Sep 8, 2026

updated

ai
ai-agent
ai-agents
ai-tools
automation
autonomous-agents
cve-scanning
googleaistudio
jobs
job-search
jobsearch
linkedin
python
smtp

README

πŸ” SnapplAI β€” AI-Powered LinkedIn Job Alerts

Stop refreshing LinkedIn. This pipeline scrapes new job listings based on your settings, uses AI agents to summarize each one and score it against your CV, then delivers only the best matches straight to your inbox πŸ“¬ β€” so you're always first to apply πŸš€

Python Google GenAI pandas python-jobspy License


πŸ“‘ Table of Contents


🎯 The Problem

Job hunting on LinkedIn is a full-time job in itself. New listings appear daily, most are irrelevant, and by the time you spot a good one, 200 people have already applied.

SnapplAI flips the game: it runs on a schedule, scrapes fresh listings, lets AI read and score every single one against your CV, and emails you only the top matches β€” before the crowd even sees them.


βš™οΈ How It Works

The pipeline runs in 4 sequential steps, fully automated:

1. Scrape β†’ job_scraper() pulls fresh listings from LinkedIn based on your search settings (role, location, filters) using python-jobspy.

2. Summarize β†’ agentic_summarize() sends each job description to Gemini, which extracts structured fields (title, seniority, skills, salary, etc.) as clean JSON.

3. Analyze β†’ agentic_analyze() reads your CV and scores each listing on how well it matches your profile. Chain-of-thought enforced: the model writes analysis before score in the JSON schema, so reasoning comes before judgment.

4. Deliver β†’ send_email() builds an email with the top-scored jobs and sends it to your inbox via SMTP.

Key principle: AI reads and evaluates. Python orchestrates and delivers. No frameworks, no agents-calling-agents β€” just a clean data pipeline with LLM calls where they matter.


πŸ”§ Tech Stack

ComponentTechnology
LLMGoogle GenAI SDK β€” gemini-3.5-flash-lite
Scrapingpython-jobspy (LinkedIn)
Datapandas, PyPDF / PyMuPDF
ParsingBeautifulSoup4
Emailsmtplib (SMTP)
Configpython-dotenv

πŸ—οΈ Pipeline Architecture

Pipeline Architecture

The entire pipeline operates on a single pandas DataFrame that gets enriched at each step. No intermediate files, no database β€” everything flows through memory.


πŸ“Š AI Output Fields

Pipeline Architecture

Each job in the email is ranked by match score and includes company, role, work mode, a one-line AI summary explaining why it matched (or didn't), and a direct apply link to the LinkedIn listing.


πŸš€ Setup

  1. Get a free API key from Google AI Studio
  2. Generate a Gmail App Password
  3. Place your CV (PDF) in your_cv_config/
  4. Configure search settings: use file_config.txt to create your file_config.env (filter docs)
  5. Create your .env from the template: cp example_env.txt .env

Deploy

Local

git clone https://github.com/TDK-99/SnapplAI.git && cd SnapplAI
pip install -r requirements.txt
# complete setup steps above
python main.py

Docker

git clone https://github.com/TDK-99/SnapplAI.git && cd SnapplAI
# complete setup steps above
docker build -t snapplai .
docker run --env-file .env snapplai

GitHub Actions

  1. Fork this repo (or create a private copy)
  2. Complete setup steps 1-4 above in your fork
  3. Edit your settings in .github/workflows/snapplai.yml under the env: block
  4. Add credentials as repository secrets (Settings β†’ Secrets β†’ Actions): GOOGLE_API_KEY, GMAIL_USER, GMAIL_APP_PASSWORD
  5. Actions tab β†’ enable workflows β†’ Run workflow

πŸ“ Project Structure

SnapplAI/
β”œβ”€β”€ main.py                 # Entry point β€” runs the 4-step pipeline
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ daily_scraper.py    # LinkedIn scraping with python-jobspy
β”‚   β”œβ”€β”€ ai_agents.py        # Gemini calls: summarize + analyze
β”‚   β”œβ”€β”€ smtp.py             # Email builder and SMTP sender
β”‚   └── pydantic.py         # pydantic class for force ai output
β”œβ”€β”€ your_cv_config/
β”‚   β”œβ”€β”€ .gitkeep            # Keeps folder tracked in git
β”‚   β”œβ”€β”€ file_config.env     # Your settings (role, location, filters)
β”‚   β”œβ”€β”€ file_config.txt     # Additional config parameters
β”‚   └── Your_CV.pdf         # Your CV goes here (PDF)
β”œβ”€β”€ .github/
β”‚   └── workflows/
β”‚       └── snapplai.yml    # GitHub Actions workflow (scheduled + manual)
β”œβ”€β”€ Dockerfile              # Run anywhere with Docker
β”œβ”€β”€ .env                    # API keys and SMTP credentials (git-ignored)
β”œβ”€β”€ example_env.txt         # Template for .env variables
β”œβ”€β”€ requirements.txt        # Dependencies
β”œβ”€β”€ LICENSE                 # MIT
└── README.md

πŸ›£οΈ Roadmap v2

  • βœ…Multi-country scraping β€” search across 2+ countries in a single run (custom feature, not supported by python-jobspy out of the box)
  • Excel/DB deduplication β€” persistent storage to compare runs and filter out already-seen listings, so you never score the same job twice
  • Scoring calibration β€” benchmark AI scores against known good/bad matches to improve match quality
  • Output redesign β€” better visual formatting for the email report (job cards, readability, direct links)
  • Fix issue β€” fix main issue: fallback model, smtp for non @gmail user and github action new user

🀝 Contributing

Contributions are welcome β€” bug fixes, new features, or docs improvements.

  • Issues β€” Report bugs or suggest features
  • Pull Requests β€” Fork, build, submit

πŸ“„ License

MIT β€” see LICENSE

See what people are saying

Contributors

TDK-99

148 commits

danyijia

17 commits

Languages

Python

96.4%

Dockerfile

3.6%