An event-driven, secure multi-agent platform that matches job seekers to the right skill-building projects.
Upload your resume, paste a job description — and ProjectMatch AI's five-agent pipeline identifies exactly which projects will close your skill gaps and make you a stronger candidate.
| Feature | Details |
|---|---|
| 📄 Universal Resume Parsing | Upload PDF, DOCX, DOC, RTF, or TXT — all parsed in-memory, zero disk writes |
| 🎯 Gap-Driven Matching | Pinpoints skills required by the JD that you're missing and finds projects that teach them |
| 🤖 5-Agent AI Mesh | Ingestion → Profiler → Discovery → Synthesis → Trust & Verification |
| 🔒 Prompt Injection Defense | Adversarial keyword scoring; inputs scoring > 0.15 are quarantined |
| 🛡️ PII Redaction | Emails and phone numbers masked before any agent processing |
| 📡 Real-Time Streaming | Server-Sent Events (SSE) stream live progress to the dashboard |
| ✅ Verified vs. Theoretical | Real DB-backed projects labelled "Verified"; model-inferred suggestions labelled "Theoretical" |
| 🔬 Two-Pass Trust Audit | Synthesis claims verified against raw DB records before results are shown |
| 📊 Radar Comparison | Side-by-side hexagonal chart across 6 axes (Gap Coverage, Domain Fit, Learning Curve, Resume Impact, Time to Complete, Market Demand) |
| 🔗 Project Combination | Select two projects and get a synergy verdict with shared/complementary skill breakdown |
| 👍 User Feedback | Thumbs up/down + comments sent to /api/feedback |
┌─────────────────────────────────────────────────────────────────────┐
│ React Frontend (Vite + TailwindCSS + Recharts) │
│ Multi-step form → SSE stream consumer → Project cards + Radar │
└──────────────────────────┬──────────────────────────────────────────┘
│ HTTP / SSE
┌──────────────────────────▼──────────────────────────────────────────┐
│ FastAPI Gateway (main.py) │
│ POST /api/analyze · GET /api/events/{id} · POST /api/combine │
│ POST /api/feedback · GET /api/roles/autocomplete │
└──────────────────────────┬──────────────────────────────────────────┘
│ In-process async task
┌──────────────────────────▼──────────────────────────────────────────┐
│ Google ADK Multi-Agent Mesh │
│ 1. IngestionGuardrailAgent — sanitise, PII redact, injection check │
│ 2. SkillGapProfilerAgent — extract resume + JD skills; gap = JD-resume │
│ 3. ProjectDiscoveryAgent — vector search (retrieval-first) + theoretical │
│ 4. SynthesisAnalysisAgent — gap coverage, experience, reasoning │
│ 5. TrustVerificationAgent — two-pass audit + confidence score │
└──────────────────────────┬──────────────────────────────────────────┘
│ MCP JSON-RPC 2.0
┌──────────────────────────▼──────────────────────────────────────────┐
│ Model Context Protocol Server │
│ Tools: lookup_taxonomy · get_project_by_id · semantic_vector_search │
│ get_all_projects · autocomplete_roles │
│ Backed by: postgres_mock.py (O*NET/ESCO taxonomy + project DB) │
│ vector_mock.py (TF cosine similarity — stdlib only) │
└─────────────────────────────────────────────────────────────────────┘
- Python 3.10+
- Node.js 18+
cd backend
pip install -r requirements.txt
python -m uvicorn app.main:app --host 127.0.0.1 --port 8000 --reloadBackend runs at http://127.0.0.1:8000
cd frontend
npm install
npm run devFrontend runs at http://localhost:3000
cd backend
docker build -t projectmatch-ai-backend .
docker run -p 8000:8000 projectmatch-ai-backendprojectmatch-ai/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI gateway, SSE, /api/combine, /api/feedback
│ │ ├── config.py # Injection thresholds, scoring weights
│ │ ├── agents/
│ │ │ ├── base.py # BaseAgent: tool boundaries, lifecycle, telemetry
│ │ │ ├── ingestion.py # Guardrail: PII redact + injection scoring
│ │ │ ├── profiler.py # Skill gap profiler (resume ↔ JD diff)
│ │ │ ├── discovery.py # Retrieval-first project search + theoretical fallback
│ │ │ ├── synthesis.py # Gap coverage scoring + reasoning
│ │ │ └── trust.py # Two-pass verification + confidence score
│ │ ├── mcp/
│ │ │ ├── server.py # JSON-RPC 2.0 tool registry
│ │ │ └── client.py # Typed async MCP client used by agents
│ │ ├── database/
│ │ │ ├── postgres_mock.py # O*NET/ESCO taxonomy + enriched project DB
│ │ │ └── vector_mock.py # TF cosine similarity (pure stdlib)
│ │ └── utils/
│ │ └── file_parser.py # Universal parser: PDF, DOCX, RTF, TXT
│ ├── requirements.txt
│ └── Dockerfile
│
└── frontend/
├── src/
│ ├── components/
│ │ ├── Dashboard.jsx # Multi-step form, SSE consumer, compare + feedback
│ │ ├── ProjectCard.jsx # Result card: impact, skills, gaps, badges
│ │ └── RadarChart.jsx # 6-axis dual-project comparison chart
│ ├── App.jsx
│ ├── main.jsx
│ └── index.css # Glassmorphism, neon glow, custom scrollbar
├── package.json
├── tailwind.config.js
├── vite.config.js
└── index.html
| Control | Implementation |
|---|---|
| Prompt injection | Adversarial keyword density score; threshold 0.15 triggers quarantine |
| PII redaction | Email + phone masked via regex before any agent sees the data |
| In-memory only | All file bytes processed via BytesIO / in-process; never written to disk |
| MCP isolation | Agents cannot import database modules directly; all access via JSON-RPC tool calls |
| Two-pass trust | Synthesis claims cross-checked against raw DB records before display |
confidence = (gap_coverage × 0.40)
+ (semantic_similarity × 0.30)
+ (experience_relevance × 0.20)
+ (soft_skills_match × 0.10)
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/analyze |
Upload resume + JD; returns session_id |
GET |
/api/events/{session_id} |
SSE stream of agent progress |
POST |
/api/combine |
Synergy report for two or more project IDs |
POST |
/api/feedback |
Submit thumbs up/down + comment |
GET |
/api/roles/autocomplete?q= |
Job title suggestions |
GET |
/health |
Health check |
| Format | Parser |
|---|---|
.pdf |
pdfminer.six — text-layer extraction |
.docx |
python-docx — paragraph extraction |
.doc |
Raw byte fallback with chardet encoding detection |
.rtf |
RTF control-word stripping via regex |
.txt / .md |
chardet auto-encoding detection |
MIT — see LICENSE