CandidAI is an AI-powered candidate intelligence platform that helps solo founders and early-stage startups identify the strongest technical candidates using semantic search instead of traditional keyword matching.
The platform combines semantic embeddings, GPU-accelerated inference, GitHub enrichment, and AI-generated interview questions to automate technical candidate evaluation while maintaining a production-oriented architecture.
Unlike traditional Applicant Tracking Systems, CandidAI treats candidate ranking as a semantic retrieval problem rather than a text generation problem.
Instead of using a Large Language Model for ranking, CandidAI uses the BAAI/bge-large-en-v1.5 embedding model to compare job descriptions and candidate profiles in vector space.
Generative AI is only used where it adds value:
- Interview Question Generation
graph TD
Browser["Browser"]
Browser --> NextUI["Next.js Dashboard"]
NextUI --> BFF["Next.js API Routes (BFF)"]
BFF --> FastAPI["Dockerized FastAPI Backend"]
FastAPI --> Embeddings["BAAI / bge-large-en-v1.5"]
Embeddings --> PyTorch["PyTorch"]
PyTorch --> GPU["AMD ROCm / NVIDIA CUDA"]
FastAPI --> PostgreSQL["Neon PostgreSQL"]
FastAPI --> GitHub["GitHub API"]
Candidate ranking is fundamentally a retrieval problem—not a generative AI problem.
Instead of sending resumes through a Large Language Model, CandidAI generates semantic embeddings and performs vector similarity search.
Benefits:
- Deterministic rankings
- Lower inference latency
- Lower GPU memory usage
- Lower deployment cost
- No hallucinations
- Better suited for semantic similarity
Large Language Models are reserved for generating personalized interview questions.
- Semantic candidate ranking using BAAI/bge-large-en-v1.5
- GPU accelerated embedding generation
- Candidate clustering using GPU K-Means
- GitHub profile enrichment
- AI-generated interview questions
- Dockerized inference backend
- AMD ROCm deployment support
- NVIDIA CUDA support
- Secure Next.js Backend-for-Frontend architecture
- Toggleable Demo Mode
- GPU Diagnostics panel
- Next.js (App Router)
- React
- TypeScript
- Tailwind CSS
- Lucide Icons
- FastAPI
- PyTorch
- SentenceTransformers
- SQLAlchemy
- Pydantic
- uv
- BAAI/bge-large-en-v1.5
- Semantic Embeddings
- GPU K-Means Clustering
- Neon PostgreSQL
- Docker
- AMD ROCm
- NVIDIA CUDA
candid/
│
├── backend/
│ ├── app/
│ │ ├── api/
│ │ ├── services/
│ │ ├── models/
│ │ ├── schemas/
│ │ ├── config/
│ │ └── main.py
│ │
│ ├── Dockerfile.local
│ ├── Dockerfile.production
│ ├── pyproject.toml
│ ├── uv.lock
│ └── .env.example
│
├── frontend/
│ ├── src/
│ ├── public/
│ ├── package.json
│ └── .env.example
│
└── README.md
AMD_BACKEND_URL=http://localhost:8000DATABASE_URL=
DEMO_MODE=true
HF_HOME=/root/.cache/huggingface
TORCH_HOME=/root/.cache/torchcd backend
uv sync
# Windows
.venv\Scripts\activate
# Linux/macOS
source .venv/bin/activate
uvicorn app.main:app --host 0.0.0.0 --port 8000cd frontend
npm install
npm run devApplication:
http://localhost:3000
Build
docker build \
-f backend/Dockerfile.production \
-t candid-backend \
backendRun
docker run --rm \
--gpus all \
-p 8000:8000 \
--env-file backend/.env.local \
--name candid-backend \
candid-backendBuild
docker build \
-f backend/Dockerfile.production \
-t candid-backend \
backendRun
docker run \
--device=/dev/kfd \
--device=/dev/dri \
--group-add video \
-p 8000:8000 \
--env-file backend/.env \
candid-backendSwagger UI
http://localhost:8000/docs
OpenAPI
http://localhost:8000/openapi.json
The browser never communicates directly with the inference backend.
All requests follow the flow:
Browser
↓
Next.js Dashboard
↓
Next.js API Routes (BFF)
↓
FastAPI Inference Service
↓
GPU
This keeps the inference endpoint private while allowing independent scaling of the frontend and backend.
The inference backend has been successfully deployed on:
- AMD Instinct MI300X
- ROCm
- PyTorch ROCm
- Docker
The same application also runs locally on NVIDIA CUDA with minimal configuration changes.
Created for the AMD Developer Challenge Act II.