A job posting gets 200+ applicants in 48 hours. By the time LinkedIn's daily digest hits your inbox, the window is already closing.
I kept finding great matches days after they were posted. So I built SnapplAI: it scrapes fresh LinkedIn listings, sends each one to Gemini to score it against your CV, and emails you only the top matches, before the crowd even sees them.
How it works
Four steps, one pandas DataFrame, no frameworks:
Scrape — fresh listings from LinkedIn based on your filters
Summarize — Gemini extracts structured fields as JSON
Analyze — each listing scored against your CV (chain-of-thought enforced: reasoning before judgment)
Deliver — top matches emailed to your inbox
Runs locally, via Docker, or as a scheduled GitHub Actions cron. Full setup takes 5 minutes.
Why no framework
I wanted a clean data pipeline with LLM calls where they matter, not an agent framework. Python orchestrates, AI evaluates. Each Gemini call retries with exponential backoff and falls back through a model chain, so a throttled API doesn't crash the run.
Try it
👉 github.com/TDK-99/SnapplAI
MIT-licensed. Issues, PRs, and forks are welcome.
Top comments (2)
Your pipeline approach using pandas and Docker really streamlines the job matching process, and it's impressive how you've prioritized a clean implementation over framework complexity. The exponential backoff for API calls is a smart choice for ensuring resilience, especially with the variability of LinkedIn's API rate limits. If you're considering enhancing the scoring mechanism further or integrating more ML models for better accuracy, I'd be interested in contributing to that effort. It sounds like a fantastic project, and I'm open to discussing potential collaboration!
Thanks for taking the time to look into the project!
A small clarification: the API fallback is for Google AI Studio (Gemini), not LinkedIn. It handles both rate limits and 503 errors from the provider.
The scoring logic is definitely an area with room to grow. Right now it's driven by an AI system prompt, so there's space to make it smarter, whether that's better prompt engineering, structured evaluation criteria, or integrating ML models down the line.
If you'd like to contribute, the best starting point is to open a thread in the Discussions tab with your idea. That way we can align on the approach before any code gets written. The flow is outlined in CONTRIBUTING.md.
😀🚀