Paste your resume + any job description → get an AI-powered gap analysis, match score, skill breakdown, and a prioritized action plan in seconds.
SkillSync uses Claude (claude-opus-4-5) to deeply analyze the semantic relationship between your resume and a target job description — going far beyond simple keyword matching.
| Feature | Description |
|---|---|
| 📊 Match Score | 0–100% semantic match using LLM reasoning |
| ✅ Matched Skills | Skills your resume already demonstrates |
| ❌ Missing Skills | Critical gaps you need to address |
| 🎯 Action Plan | Prioritized steps (High / Medium / Low) |
| 🏷️ Keywords | ATS-optimized keywords to add to your resume |
| Weak points a recruiter might probe | |
| 💪 Strengths | Where you stand out for this specific role |
Resume: 3 years Python, ML Engineer, scikit-learn, pandas, FastAPI
JD: Senior MLOps Engineer — Kubernetes, MLflow, Airflow, Terraform
→ Match Score: 52%
→ Missing: Kubernetes, MLflow, Airflow, Terraform, CI/CD
→ Action: "Add a personal project deploying a model to Kubernetes (minikube)"
→ Risk: "No production deployment experience mentioned"
User Input (Resume + JD)
│
▼
┌──────────────────┐
│ Streamlit UI │ ← app.py
└────────┬─────────┘
│ structured prompt
▼
┌──────────────────────────┐
│ Anthropic Claude API │ ← claude-opus-4-5
│ (claude-opus-4-5) │
└────────┬─────────────────┘
│ JSON response
▼
┌──────────────────┐
│ Parsed Results │ → Score, Skills, Actions, Risks
└──────────────────┘
Key design decisions:
- LLM-as-reasoner: Claude doesn't just match keywords — it infers transferable skills, notices context, and understands job-level seniority
- Structured JSON output: Prompt engineering forces Claude to return strict JSON, making the output reliably parseable
- No vector DB needed: For single document comparison, a well-crafted prompt outperforms embeddings + cosine similarity at a fraction of the complexity
git clone https://github.com/ParamVerma535/skillsync.git
cd skillsyncpip install -r requirements.txtcp .env.example .env
# Edit .env and paste your Anthropic API key
# Get one free at: https://console.anthropic.comOr export it directly:
export ANTHROPIC_API_KEY=sk-ant-...streamlit run app.pyOpen http://localhost:8501 in your browser.
The core of this project is a carefully engineered prompt. Key techniques used:
# 1. Role assignment for expertise framing
"You are an expert technical recruiter and career coach."
# 2. Strict JSON-only output to prevent markdown wrapping
"Return ONLY a JSON object with no markdown, no backticks."
# 3. Explicit schema definition to force structured output
# (see the full JSON schema in app.py)
# 4. Sanitization before parsing
raw = re.sub(r"```json|```", "", raw).strip()
result = json.loads(raw)This pattern — role + constraint + schema + sanitize — is the foundation of reliable LLM output parsing.
skillsync/
├── app.py # Main Streamlit application
├── requirements.txt # Python dependencies
├── .env.example # API key template
├── .gitignore
└── README.md
- Upload PDF resume (use
pypdforpdfminer) - Batch analyze multiple JDs at once
- Export results as PDF report
- Add FAISS/ChromaDB for multi-resume management
- Fine-tune scoring with domain-specific weights
- Streamlit Cloud / HuggingFace Spaces deployment
- Frontend: Streamlit — rapid Python web UI
- LLM: Anthropic Claude —
claude-opus-4-5 - Language: Python 3.9+
- Prompt Strategy: Structured JSON output via zero-shot instruction
PRs welcome! If you extend this with PDF upload, batch processing, or a new analysis dimension — open a PR.
MIT — use freely, modify freely, credit appreciated.
Built with ❤️ and the Anthropic Claude API