{"slug": "snapplai-apply-to-jobs-in-a-snap", "title": "SnapplAI – Apply to Jobs in a Snap", "summary": "SnapplAI, an open-source job-hunting pipeline created by TDK-99, scrapes LinkedIn listings, uses Google's Gemini 3.5 Flash Lite AI to summarize and score each job against a user's CV, and emails only the top matches. The pipeline runs in four automated steps—scrape, summarize, analyze, deliver—and is available on GitHub with setup via Docker or GitHub Actions.", "body_md": "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 🚀\n\n[The Problem](#-the-problem)[How It Works](#-how-it-works)[Tech Stack](#-tech-stack)[Pipeline Architecture](#-pipeline-architecture)[AI Output Fields](#-ai-output-fields)[Setup](#-setup)[Project Structure](#-project-structure)[Roadmap v2](#-roadmap-v2)[Contributing](#-contributing)[License](#-license)\n\nJob 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.\n\n**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.\n\nThe pipeline runs in 4 sequential steps, fully automated:\n\n**1. Scrape** → `job_scraper()`\n\npulls fresh listings from LinkedIn based on your search settings (role, location, filters) using python-jobspy.\n\n**2. Summarize** → `agentic_summarize()`\n\nsends each job description to Gemini, which extracts structured fields (title, seniority, skills, salary, etc.) as clean JSON.\n\n**3. Analyze** → `agentic_analyze()`\n\nreads your CV and scores each listing on how well it matches your profile. Chain-of-thought enforced: the model writes `analysis`\n\nbefore `score`\n\nin the JSON schema, so reasoning comes before judgment.\n\n**4. Deliver** → `send_email()`\n\nbuilds an email with the top-scored jobs and sends it to your inbox via SMTP.\n\n**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.\n\n| Component | Technology |\n|---|---|\n| LLM | Google GenAI SDK — `gemini-3.5-flash-lite` |\n| Scraping | python-jobspy (LinkedIn) |\n| Data | pandas, PyPDF / PyMuPDF |\n| Parsing | BeautifulSoup4 |\n| smtplib (SMTP) | |\n| Config | python-dotenv |\n\nThe entire pipeline operates on a single pandas DataFrame that gets enriched at each step. No intermediate files, no database — everything flows through memory.\n\nEach 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.\n\n- Get a free API key from\n[Google AI Studio](https://aistudio.google.com/apikey) - Generate a\n[Gmail App Password](https://myaccount.google.com/apppasswords) - Place your CV (PDF) in\n`your_cv_config/`\n\n- Configure search settings: use\n`file_config.txt`\n\nto create your`file_config.env`\n\n([filter docs](https://github.com/Bunsly/JobSpy)) - Create your\n`.env`\n\nfrom the template:`cp example_env.txt .env`\n\n```\ngit clone https://github.com/TDK-99/SnapplAI.git && cd SnapplAI\npip install -r requirements.txt\n# complete setup steps above\npython main.py\ngit clone https://github.com/TDK-99/SnapplAI.git && cd SnapplAI\n# complete setup steps above\ndocker build -t snapplai .\ndocker run --env-file .env snapplai\n```\n\n- Fork this repo (or\n[create a private copy](#private-copy)) - Complete setup steps 1-4 above in your fork\n- Edit your settings in\n`.github/workflows/snapplai.yml`\n\nunder the`env:`\n\nblock - Add credentials as\n**repository secrets**(Settings → Secrets → Actions):`GOOGLE_API_KEY`\n\n,`GMAIL_USER`\n\n,`GMAIL_APP_PASSWORD`\n\n**Actions** tab → enable workflows →**Run workflow**\n\n```\nSnapplAI/\n├── main.py                 # Entry point — runs the 4-step pipeline\n├── src/\n│   ├── daily_scraper.py    # LinkedIn scraping with python-jobspy\n│   ├── ai_agents.py        # Gemini calls: summarize + analyze\n│   └── smtp.py             # Email builder and SMTP sender\n├── your_cv_config/\n│   ├── .gitkeep            # Keeps folder tracked in git\n│   ├── file_config.env     # Your settings (role, location, filters)\n│   ├── file_config.txt     # Additional config parameters\n│   └── Your_CV.pdf         # Your CV goes here (PDF)\n├── .github/\n│   └── workflows/\n│       └── snapplai.yml    # GitHub Actions workflow (scheduled + manual)\n├── Dockerfile              # Run anywhere with Docker\n├── .env                    # API keys and SMTP credentials (git-ignored)\n├── example_env.txt         # Template for .env variables\n├── requirements.txt        # Dependencies\n├── LICENSE                 # MIT\n└── README.md\n```\n\n**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)\n\nContributions are welcome — bug fixes, new features, or docs improvements.\n\n**Issues**— Report bugs or suggest features** Pull Requests**— Fork, build, submit\n\nMIT — see [LICENSE](/TDK-99/SnapplAI/blob/main/LICENSE)", "url": "https://wpnews.pro/news/snapplai-apply-to-jobs-in-a-snap", "canonical_source": "https://github.com/TDK-99/SnapplAI", "published_at": "2026-08-25 23:12:02+00:00", "updated_at": "2026-08-25 23:44:45.329475+00:00", "lang": "en", "topics": ["artificial-intelligence", "ai-agents", "ai-tools", "natural-language-processing"], "entities": ["SnapplAI", "TDK-99", "LinkedIn", "Gemini 3.5 Flash Lite", "Google AI Studio", "GitHub", "Docker", "JobSpy"], "alternates": {"html": "https://wpnews.pro/news/snapplai-apply-to-jobs-in-a-snap", "markdown": "https://wpnews.pro/news/snapplai-apply-to-jobs-in-a-snap.md", "text": "https://wpnews.pro/news/snapplai-apply-to-jobs-in-a-snap.txt", "jsonld": "https://wpnews.pro/news/snapplai-apply-to-jobs-in-a-snap.jsonld"}}