An explainable candidate screening and ranking platform for recruiters.
CareerGraph is a backend-first hiring platform where recruiters create jobs, candidates apply with their resumes, and a matching engine ranks applicants for a specific job using structured resume signals, skill matching, semantic similarity, and experience fit.
The goal is not to build another generic job portal. The core engineering problem is:
Job Requirements
+
Applications
+
Candidate Resumes
↓
Resume Understanding
↓
Candidate–Job Features
↓
Explainable Ranking
↓
Recruiter Decision Support
Traditional applicant tracking systems are good at storing applications, but candidate discovery and ranking often rely on keyword filters or opaque scoring.
CareerGraph is designed around three principles:
- Job-specific ranking — candidates are ranked against the role they actually applied for.
- Explainability — every score should be decomposable into understandable signals.
- Progressive intelligence — start with deterministic, testable ranking features and introduce learned ranking only when real feedback data exists.
Candidate Recruiter
│ │
├── Sign up ├── Sign up
├── Build profile ├── Create job
├── Upload resume ├── View applicants
└── Apply to job └── View ranked applicants
│ ▲
└──────── Application ─────────────┤
│
Matching Engine
│
┌────────────────────┼───────────────────┐
│ │ │
Skill Match Semantic Match Experience Fit
│ │ │
└────────────────────┼───────────────────┘
│
Explainable Score
- Candidate signup
- Recruiter signup
- Login with JWT authentication
- Current-user endpoint
- Role-based access control
- Candidate/recruiter resource ownership
- Candidate profile
- Profile update
- Resume upload
- Resume processing status
- Apply to jobs
- View own applications
- Recruiter profile
- Create and manage jobs
- View applicants for owned jobs
- Update application status
- View ranked applicants with score breakdowns
- Title and description
- Responsibilities
- Required skills
- Preferred skills
- Minimum experience
- Location
- Job type
- Job status
- Recruiter ownership
- Candidate–job application entity
- One application per candidate per job
- Application status workflow
- Resume snapshot/reference used for the application
- PDF upload
- Text extraction
- Structured resume representation
- Skill normalization
- Experience/project/education extraction
- Required-skill match
- Preferred-skill match
- Semantic resume ↔ job-description similarity
- Experience fit
- Weighted explainable score
- Matched and missing skills
- Human-readable score explanation
- Persisted ranking results
CareerGraph V1 does not ask an LLM to arbitrarily decide which candidate is best.
The ranking engine builds explicit features and combines them into a reproducible score.
Initial scoring model:
Overall Score =
40% Required Skill Match
+ 35% Semantic Similarity
+ 15% Experience Fit
+ 10% Preferred Skill Match
These weights are a V1 baseline and must remain configurable rather than hard-coded across the application.
Example result:
Candidate: Alex
Overall Match: 84/100
Required Skills: 90
Semantic Similarity: 82
Experience Fit: 75
Preferred Skills: 80
Matched Skills:
Python, FastAPI, Docker
Missing Skills:
Kubernetes, AWS
Client
│
▼
FastAPI
│
┌──────────────────┼──────────────────┐
│ │ │
Auth Recruiter Candidate
│ │ │
│ Jobs Profile
│ │ Resume
│ └────────┬─────────┘
│ │
│ Applications
│ │
└───────────────────────────┼────────────────┐
│ │
▼ ▼
PostgreSQL Resume Parser
│
▼
Structured Resume
│
▼
Matching Engine
│
┌───────────────────┼──────────────────┐
│ │ │
Skills Semantic Experience
Matcher Matcher Matcher
│ │ │
└───────────────────┼──────────────────┘
▼
Feature Builder
│
▼
Weighted Scorer
│
▼
MatchResult
│
▼
Ranked Applicants
CareerGraph V1 is a modular monolith.
We intentionally avoid premature microservices. The API, domain services, persistence layer, resume-processing logic, and matching engine live in one deployable application with clean internal boundaries.
- Python
- FastAPI
- Pydantic
- SQLAlchemy
- REST APIs
- PostgreSQL — V1 production database
- Alembic — schema migrations
pgvector— optional when vector persistence/search becomes necessary
- PDF text extraction
- Structured resume parsing
- Sentence/document embeddings
- Cosine similarity
- Deterministic feature engineering
- Explainable weighted ranking
- Docker
- Docker Compose for local services
- Pytest