π 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
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 π
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.
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.
| Component | Technology |
|---|---|
| LLM | Google GenAI SDK β gemini-3.5-flash-lite |
| Scraping | python-jobspy (LinkedIn) |
| Data | pandas, PyPDF / PyMuPDF |
| Parsing | BeautifulSoup4 |
| smtplib (SMTP) | |
| Config | python-dotenv |

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

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.
your_cv_config/file_config.txt to create your file_config.env (filter docs).env from the template: cp example_env.txt .envgit clone https://github.com/TDK-99/SnapplAI.git && cd SnapplAI
pip install -r requirements.txt
# complete setup steps above
python main.py
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/workflows/snapplai.yml under the env: blockGOOGLE_API_KEY, GMAIL_USER, GMAIL_APP_PASSWORDSnapplAI/
βββ 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
Contributions are welcome β bug fixes, new features, or docs improvements.
MIT β see LICENSE
Hacker News (3)
Python
96.4%
Dockerfile
3.6%
π 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
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 π
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.
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.
| Component | Technology |
|---|---|
| LLM | Google GenAI SDK β gemini-3.5-flash-lite |
| Scraping | python-jobspy (LinkedIn) |
| Data | pandas, PyPDF / PyMuPDF |
| Parsing | BeautifulSoup4 |
| smtplib (SMTP) | |
| Config | python-dotenv |

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

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.
your_cv_config/file_config.txt to create your file_config.env (filter docs).env from the template: cp example_env.txt .envgit clone https://github.com/TDK-99/SnapplAI.git && cd SnapplAI
pip install -r requirements.txt
# complete setup steps above
python main.py
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/workflows/snapplai.yml under the env: blockGOOGLE_API_KEY, GMAIL_USER, GMAIL_APP_PASSWORDSnapplAI/
βββ 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
Contributions are welcome β bug fixes, new features, or docs improvements.
MIT β see LICENSE
Hacker News (3)
Python
96.4%
Dockerfile
3.6%