A Streamlit web app that uses a large language model to compare your CV against any job description and return a structured analysis: match score, matched skills, missing skills, and specific improvement suggestions.
Built with Groq's free API tier. No OpenAI costs, no paid subscriptions required.
Upload your CV as a PDF, TXT, or MD file, then paste the job description on the right. The dark sidebar holds your Groq API key.
After analysis you get a score ring, a verdict, and a summary sentence. Below that, matched skills are shown in green and missing skills in red.
The bottom section breaks down your strongest points for the role and gives numbered, actionable tips for improving your application.
- Accept a CV (PDF, TXT, or pasted text) and a job description
- Clean and normalize the text to handle special characters
- Send both to
llama-3.1-8b-instantvia Groq with a structured prompt - Parse the JSON response and render a visual match report
- Show matched skills, missing skills, strengths, and actionable tips
| Layer | Tool |
|---|---|
| UI | Streamlit |
| LLM | Llama 3.1 8B via Groq API |
| PDF parsing | PyPDF2 |
| Fonts | Plus Jakarta Sans, JetBrains Mono |
| Icons | Tabler Icons |
| Language | Python 3.10+ |
| Cost | Free (Groq free tier) |
git clone https://github.com/YOUR_USERNAME/ai-cv-screener.git
cd ai-cv-screenerpython -m venv venv
venv\Scripts\activate # Windows
source venv/bin/activate # Mac / Linuxpip install -r requirements.txtGo to console.groq.com, sign up, and create an API key. No credit card needed.
streamlit run app.pyOpen http://localhost:8501 and paste your key into the sidebar.
ai-cv-screener/
├── app.py # Main Streamlit application
├── requirements.txt # Python dependencies
├── screenshots/
│ ├── input.png
│ ├── results.png
│ └── details.png
├── .env.example
├── .gitignore
└── README.md
- How to write structured prompts that reliably return JSON from an LLM
- How to handle JSON parsing failures gracefully when smaller models break format
- How to extract and normalize text from PDFs in Python, including handling Finnish special characters
- How to apply deep CSS customization on top of Streamlit to produce a production-quality UI
- How Groq's OpenAI-compatible API works and how to manage authentication correctly
- How to debug encoding errors from real-world PDF files
My thesis at JAMK evaluated multilingual sentence embedding models for Finnish and English course description similarity. This project applies the same core idea (comparing two text documents semantically) but uses a generative LLM instead of embedding cosine similarity. A natural extension of this project would be to add a RAG layer using sentence-transformers to do more granular skill extraction at the embedding level rather than relying entirely on the LLM prompt.
- Add Finnish language support for job postings from Duunitori or TE-palvelut
- Add a CV rewrite section that rewrites weak bullet points to better match the job
- Deploy on Streamlit Cloud (free tier available, takes 5 minutes)
- Swap to a stronger model like
llama-3.3-70b-versatilefor more accurate analysis - Add side-by-side comparison of original and improved CV sections
Madee — IT Engineer, JAMK University of Applied Sciences Specialization: AI and Data Analytics


