Upload your CV. Paste a job description. Get your match score, skill gap analysis, tailored interview talking points, and rewritten CV bullets β in under 10 seconds.
π¬ Live demo:
Most people apply to jobs blindly β sending the same CV everywhere and hoping for the best. JobSense fixes that.
Upload your CV (PDF) and paste any job description. The app uses Retrieval-Augmented Generation (RAG) to cross-reference both documents via two independent FAISS vector stores, then produces a structured career report with:
| Output | What you get |
|---|---|
| π Match Score | 0β100% score showing how well your CV fits the role |
| β Matched Skills | Skills you already have that the JD is asking for |
| β Skill Gaps | Missing skills you need to develop or address |
| πͺ Strengths | Your strongest selling points for this specific role |
| π¬ Interview Talking Points | 5 ready-to-use points tailored to this JD |
| βοΈ Rewritten CV Bullets | 3 bullets rewritten to match the job's language and priorities |
CV (PDF) βββΊ PyMuPDF βββΊ Text Chunks βββΊ HuggingFace Embeddings βββΊ FAISS Store A βββ
ββββΊ Similarity Search
Job Description βββΊ Splitter βββΊ Text Chunks βββΊ HuggingFace Embeddings βββΊ FAISS Store B βββ
β
Retrieved Context βββ€
βΌ
System Prompt + RAG Context βββΊ Llama 3.3 70B (Groq)
β
βΌ
Pydantic Parser βββΊ Structured JSON
β
βΌ
Streamlit UI βββΊ You
Why two FAISS stores? Most RAG tutorials query a single document. JobSense cross-references two separate vector stores simultaneously β querying your CV against the job description's requirements. This is the same pattern used in enterprise systems that match user profiles against policy or requirements databases.
| Layer | Technology | Purpose |
|---|---|---|
| LLM | Llama 3.3 70B via Groq | Ultra-fast inference for structured analysis |
| Vector DB | FAISS (local, CPU) | Zero cost, zero latency, no external service needed |
| Embeddings | sentence-transformers (HuggingFace) |
Local embeddings β no API key needed |
| Document parsing | PyMuPDF | Reliable text extraction from real-world PDFs |
| Output schema | Pydantic v2 | Guarantees structured JSON every time |
| Orchestration | LangChain 0.3 LCEL | Clean pipeline: prompt β llm β parser |
| UI | Streamlit 1.45 | Deployed and shareable in minutes |
JobSense-AI-Career-Coach/
βββ app.py # Streamlit UI β upload, report rendering, buttons
βββ ingest.py # PDF/text β chunks β embeddings β FAISS vector store
βββ generate.py # Retrieval chain + Llama 3.3 70B + structured output
βββ schema.py # CareerReport Pydantic model (the JSON contract)
βββ requirements.txt # All dependencies pinned
βββ .env # Your GROQ_API_KEY (never commit this)
βββ .gitignore # Excludes .env and __pycache__
βββ README.md
1. Clone the repo
git clone https://github.com/muneeracodes/JobSense-AI-Career-Coach.git
cd JobSense-AI-Career-Coach2. Create a virtual environment
python -m venv venv
source venv/bin/activate # Mac / Linux
venv\Scripts\activate # Windows3. Install dependencies
pip install -r requirements.txt4. Add your Groq API key
Create a .env file in the project root:
GROQ_API_KEY=gsk_your_key_here
Get a free key at console.groq.com β no credit card required.
5. Run
streamlit run app.pyOpen http://localhost:8501 in your browser.
.env
__pycache__/
*.pyc
Your repo should be public at github.com/muneeracodes/JobSense-AI-Career-Coach.
Visit share.streamlit.io β sign in with GitHub β click "Create app".
| Field | Value |
|---|---|
| Repository | muneeracodes/JobSense-AI-Career-Coach |
| Branch | main |
| Main file path | app.py |
Click "Advanced settings" β "Secrets" β paste:
GROQ_API_KEY = "gsk_your_key_here"
β οΈ Never put your API key in any committed file. Streamlit Secrets is the correct way.
Click "Deploy". In ~2 minutes you get a live public URL:
https://jobsense-ai-career-coach-g9ucp9ucell8uzph7zrb2e.streamlit.app/
{
"match_score": 74,
"matched_skills": ["Python", "Django", "REST APIs", "PostgreSQL", "Git"],
"missing_skills": ["Kubernetes", "AWS Lambda", "Redis"],
"strengths": [
"3 years of production Django experience directly matches the JD requirement",
"Open source contributions demonstrate code quality and collaboration",
"PostgreSQL expertise fully covers the database requirement"
],
"rewritten_bullets": [
"Architected and deployed a Django REST API serving 50k+ daily requests with 99.9% uptime",
"Reduced query response time by 40% through PostgreSQL indexing and query optimisation",
"Led migration of a monolithic Flask app to microservices, cutting deploy time by 60%"
],
"interview_talking_points": [
"Lead with your Django production experience β it directly matches their core requirement",
"Frame your REST API work in terms of scale and uptime, not just features built",
"For the Kubernetes gap: mention you're actively learning it and show your progress",
"Use your open source contributions as proof of code review and collaboration",
"Ask about their infrastructure pain points β shows strategic thinking"
]
}- Scanned PDFs not supported β requires text-based PDFs; OCR support is planned
- English only β prompt engineering is optimised for English JDs and CVs
- Session-based β report resets on page refresh (by design for privacy)
- OCR support for scanned CVs (Tesseract / AWS Textract)
- Export report as styled PDF
- Compare multiple job descriptions side by side
- LinkedIn JD auto-import via URL
- RAGAS evaluation for retrieval quality scoring
Muneera β @muneeracodes π Live App: jobsense-ai-career-coach-g9ucp9ucell8uzph7zrb2e.streamlit.app Built to solve a real problem while job hunting β and as a portfolio project demonstrating LangChain RAG with dual vector stores.
MIT β use it, fork it, improve it. Attribution appreciated but not required.

