Repository navigation
Releases: TDK-99/SnapplAI
Release list
v1.9 Relocation scoring, config-driven search & LLM resilience tests
What's new
Features
- Relocation-aware scoring β jobs offering relocation now get a fit-score boost. The
relocationparameter is configurable infile_config.env. - Config-driven search settings β search parameters are loaded from
file_config.envinstead of being hardcoded in the workflow.
Reliability & testing
- Added pytest suite for the LLM fallback/retry logic (
generate_content_resilient), covering model rotation, sticky pointer, and non-retryable error handling. - New CI job (
llm_resilient) runs the resilience tests on every push. - Fixed
load_dotenvmock in job scraper tests to ensure proper env-var isolation.
Docs
- README rewritten and improved.
v1.8 Location accuracy, country filter & ui email
- Fix geo scoring: job location passed to scoring agent, no more fabricated cities for remote jobs
- Added country_no filter to exclude unwanted countries from scraping
- Email report rebuilt as HTML with per-job cards, mobile-friendly
- Simplified email subject: "SnapplAI - search term + date"
- Fix xlsx attachment filename extension
- load_dotenv(override=True) across all src modules
- Added CI job for scraper testing
- Added CLAUDE.md with repo workflow standards
- Updated README with new output screenshot and completed v2 roadmap
v1.7 Analytics Report & CI Coverage
What's new
- Analytics report attached to daily email: a new analysis step extracts insights from scraped jobs and sends them as a .txt attachment alongside the Excel file
- Improved city filtering: added precise city input for job filtering, with post-filter count logging for pipeline visibility
- Richer email subject: now includes job info directly in the SMTP subject line
CI / Testing
- Added unit test for AI analyze agent (test_ai_analyze.py)
- Added unit test for SMTP email sending (test_smtp.py), fully mocked with no secrets required
- Both tests integrated in ci.yml workflow
- Simplified workflow config by removing country+job params for cleaner test runs
Docs & Community
- Added CONTRIBUTING.md and SUPPORT.md
- Updated README with new architecture diagram, output screenshots and project file structure
- Updated yml.example template
v1.6 Provider-agnostic SMTP & smarter job summarization
What's new
Provider-agnostic email delivery β SMTP host, port, and credentials are now fully configurable via .env. Gmail still works out of the box, but you can now use Outlook/Office365, Mailtrap, or any SMTP provider. Port 465 uses SSL, all other ports use STARTTLS automatically.
Improved AI summarization β The system prompt now extracts role and city more reliably: role comes from the scraped title, city defaults to your configured location for remote jobs with no location listed.
New CI pipeline β Added automated test for the AI summarization step with mocked LLM responses.
Contributors
@willsf2021 (SMTP refactor)
v1.5 resilient Gemini calls with retry, backoff and model fallback
Adds resilience to LLM calls against Gemini API rate limits and transient failures.
What changed:
- Exponential backoff with retry on failed Gemini calls
- Model fallback chain across free-tier models: when a model hits its limit, the system switches to the next available one
- Sticky + circular fallback logic to avoid wasting retries on already-exhausted models at every row
- Row-level error tracking for better debugging when a call fails
Contributor: @willsf2021 (core retry/fallback implementation)
v1.4 add city/location filter | improve AI summ & score pipeline
Summary
- Added city-based filtering in job processing pipeline
- AI summarize now extracts location and city from job posts
- Location/city passed as input to AI score via Pydantic output models
- Simplified system prompt by moving output format to Pydantic classes
- Added handling for empty job results (message or skip)
- Dirty column cleanup on DataFrame
- Logging improvements (prints with flush)
- Location validation layer in main
- Docs and README updated with multi-country/city config examples
- Bug fixes: email format, if-city positioning, extra parenthesis
v1.3 fix-improve-feat
- Multi-location scraping now concatenates results into a single DataFrame
- Email refactored to EmailMessage + add_attachment(), fixing attachment failures
- Various bug fixes (.env parsing, CV path resolution, unused imports cleanup)
- Added openpyxl to dependencies for xlsx file all job
v1.2 β Structured scoring & pipeline stability
Improved AI scoring β added overqualified rule in prompt (internship/stage with 2+ yrs experience β score capped at 3), enforced output with Pydantic schema to prevent malformed JSON and score column KeyError.
Bug fixes β resolved AI output JSON format error, missing a_summary column, environment variables in workflow not matching Python code.
Pipeline stability β added time.sleep between Gemini API calls to respect rate limits, tuned to 7 seconds.
CI/CD β customized workflow YAML with correct env mapping, Pydantic dependency added to requirements.
Debug β diagnostic prints inside AI scoring to monitor results in GitHub Actions logs.
v1.1 β Deploy-ready
SnapplAI is now fork-friendly. This release adds deployment support so anyone can run the pipeline with minimal setup:
- Dockerfile for containerized execution on any machine
- GitHub Actions workflow with configurable schedule, manual trigger, and user-editable settings
- Updated README with setup instructions and three deploy paths (local, Docker, GitHub Actions)
- Private copy guide for users who want to keep their config hidden
v1 SnapplAI
Stop refreshing LinkedIn. Let AI do it for you.
SnapplAI scrapes fresh job listings, uses Gemini to summarize and score each one against your CV, and delivers only the best matches straight to your inbox β so you apply before the crowd even sees the listing.
What's in v1:
- Automated LinkedIn scraping via python-jobspy
- AI-powered summarization: extracts title, seniority, skills, salary, modality and 10+ structured fields from raw job descriptions
- AI-powered scoring: chain-of-thought analysis before score β reasoning first, judgment second
- SMTP email delivery with ranked results and direct apply links
- Fully configurable: drop your CV, set your filters, run one command
Built with Google GenAI SDK (Gemini), pandas, and zero frameworks. Python orchestrates, AI evaluates.
Get started β https://github.com/TDK-99/SnapplAI